我正在学习SQL注入,并且我构建了一个Web应用程序(PHP + MYSQL(5.6))而没有保护SQL注入。
简而言之,我的网络应用程序使用
SELECT * FROM XXX.USER WHERE user_name='${USERNAME}' AND password='${PASSWORD}'
处理登录(如果该sql只返回1行,则登录成功)。
一开始,我发现输入USERNAME Sayakiss' --
然后输入我的SQL:
SELECT * FROM XXX.USER WHERE user_name='Sayakiss' -- ' AND password='${PASSWORD}'
通过这种方式,攻击者可以在没有密码的情况下以Sayakiss
登录。
然后我发现更有趣的东西(select
子句可以在if
函数中) - 攻击者输入USERNAME为
Sayakiss' and if((select ascii(mid(z,p,1)) from x.y limit n,1)=c,1,0) --
这可以检查字符p
的{{1}}位置字符的ascii - 表n
的列z
的第n行等于x.y
或不
如果攻击者登录成功,则他知道该字符的ascii等于c
。
攻击者可以通过枚举来获取我的数据库的所有内容!
现在我想知道,如何(如果可能的话)执行更新查询以类似方式编写数据库?