我正在做一个关于webapp安全性和漏洞的学校项目,为此我创建了自己的非常简单的网站,其中包含登录和搜索栏。
现在,我已经故意使登录静默,而搜索栏显示SQL注入的输出。因此,出于演示目的,我想对登录进行基于时间的完全盲目的SQL注入攻击......但是我有点卡住了。
我不知道如何在基于时间的情况下枚举表中登录查询的列数:
SELECT * FROM customer WHERE cMAIL='' AND cPWD='';
我不能做ORDER BY n;#,因为当出现问题时我绝对没有错误输出。我能得到任何指示的唯一方法是通过SLEEP()或BENCHMARK()。
但我不能将ORDER BY放入SELECT IF()语句中。那么如何找出存在多少列呢? (这使我的工会不可能)。
谢谢!
编辑:值得一提的是,该网站的目的非常不安全(不使用mysqli,只是mysql)。因为它仅用于演示
答案 0 :(得分:3)
好的,我找到了自己问题的答案:
我没有使用ORDER BY,而是使用SELECT和bruteforced来查看存在多少列:
SELECT * FROM customer WHERE cMAIL='' AND cPWD='';
可以通过以下方式在黑暗中进行枚举:
SELECT * FROM customer WHERE cMAIL='' UNION SELECT null,null,null AND SLEEP(5);# AND cPWD=''
您只需向数据库添加更多空值,直到数据库休眠5秒钟。然后你知道给定表中有多少列。
希望这可以帮助别人。