前言:之前没有总结完,这次继续总结!
输入密码查看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
,接下来就来查看下载的文件
1 | $str = strstr($_SERVER['REQUEST_URI'], '?'); |
strstr
函数将URL?
后的值(包括?)一起赋给变量str
1 | $str = substr($str,1); |
去除?
1 | $str = str_replace('key','',$str); |
如果变量str
中存在key,则替换掉
最核心的代码就是这一段代码
1 | if(md5($key1) == md5($key2) && $key1 !== $key2){ |
两个变量的MD5值需相同,但是变量不能够相同,才可以得出flag,这点涉及到了MD5的绕过
md5加密之后以0e开头的,值都为0,那是因为0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。
常见的0e
开头:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
既然知道了如何绕过,那就来构造语句,但是要注意前面将key
这个关键字给过滤掉了,所以采用错位
的方法构造payload:
1 | ?kekeyy1=QNKCDZO&kekeyy2=s214587387a |
得出flag
除此之外,看了大师傅们的博客,发现绕过MD5的方法还可以利用数组
md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
所以构造payload:
1 | http://123.206.87.240:8002/web16/?kekeyy1[]=aa&kekeyy2[]=bb |
得出flag
成绩单
明显的回显注入,判断闭合符号是单引号,省略符号是#
,这道题也没有过滤关键字什么的,按照通用的语句来做即可,这里就不阐述了。
速度要快
查看源码发现
需要一个带margin属性的post请求,除此之外应该还有其他线索,用burp进行抓包,发现请求头中隐藏有flag,base64解码提交确不正确,搞了好久才发现原来每go一次,flag便变化一次
看了大师傅的write up,需要py脚本来解决,自己还写不出来就参考大师傅的脚本
1 | import requests |
cookies欺骗
一开始做这道题很懵,后来发现url上a2V5cy50eHQ=
是base64编码,解码查看
解码得到keys.txt
,说明当前访问的是keys.txt
文件,那按照这样的格式把index.php
也转换成base64编码格式查看源码。
发现改变line的值会出现一段PHP语句,写一个简单的脚本把所有的代码跑出来
1 | import requests |
结果:
1 |
|
审计代码,发现有一段代码特殊
1 | if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){ |
再结合题目,cookies欺骗,抓包修改参数即可访问keys.php
,不过这里keys.php
需要转化成base64的格式。
前女友(SKCTF)
这个链接是可以点开的,一开始没注意到,在抓包过程中才发现
一段PHP代码,考察MD5漏洞的,但是和之前的题中有一点不同,这道题还考察了strcmp
函数的漏洞
strcmp(str1,str2)比较两个字符串,如果相等就返回0。
在php 5.2版本之前,利用strcmp函数将数组与字符串进行比较会返回-1,但是从5.3开始,会返回0
所以利用这个漏洞构造payload:
1 | ?v1=s214587387a&v2=s878926199a&v3[]=1 |
或都用数组来绕过,payload:
1 | ?v1[]=1&v2[]=2&v3[]=1 |
得出flag
这次就先总结到这里。