登陆界面。访问129.211.173.64:3080/www.zip
可以得到源码
config.php(这是用来连数据库的,没啥用,就不贴了)
login.php
1 | php复制代码<?php |
DB.php
1 | php复制代码<?php |
审计代码的逻辑,进行了两次格式化字符串,密码还用md5()包裹,而且每次都用单引号把%s闭合了,并且在替换%s前还用了real_escape_string($value)
进行转义。(盯着这几个安全函数几个小时差点哭了555)
好吧好吧,还是有注入点的。这里用到了vsprint语句。在w3school可以查到它的例子
1 | php复制代码<?php |
也就是说,可以post数组来逃逸引号。先来看看正常的sql查询语句
SELECT * FROM
userswhere password=md5(%s) and name=%s limit 1
其中两个%s就是post的账号和密码。
如果我们密码输入%s,name输入一个数组,第一个元素用来闭合md5并且注入再注释,第二个元素随便输,就能绕过了!
可以构造payload如下
name[0]=) or [bool] #&name[1]=a&password=%s
其中[bool]用来塞布尔值。
sql语句就会变为
SELECT * FROM
userswhere password=md5() or [bool] #) and name=a limit 1
试一下postname[0]=) or 1=1 #&name[1]=a&password=%s
还有一半flag在数据库里边。用二分脚本跑盲注即可。这里有个坑,最后查details的时候表名要写成2021
.NcTF
其他任何形式都不行。脚本如下(当然不是我这个菜鸡写的啦)
1 | python复制代码import requests |
本文转载自: 掘金