4、数。-> ?id=1开火!任务完成!我们得到了登陆名Dumb和密码Dump。我们在URL上添加了一个参数,并让这个参数指向第一条记录。这是便生成了一个从浏览器到数据库的表中的一个快速的查询,从而来获取“id=1”的记录。同样,你可以构造查询来得到后面的记录如2,3,4……。在后端的实际查询如下:Select * from TABLE where id=1;原文这里只是给了简单的用了id=1来正常查询了一条记录,根据原程序作者博客的说明,这里应该是有一个字符型的单引号注入,如下解释:)在第一节index.php文件的第29行中:$
5、sql="SELECT * FROM users WHERE id='$id'LIMIT 0,1";这里的$id是被单引号包裹的。通过如下的注入查询可以验证:id=1'(这样看来,原文作者上面给的实际执行的SQL语句就不对了,应为Select*fromTABLEwhereid='1';)以下两个注入可以成功执行。' or '1'='1' or 1=1 --+后者采用的注释的方法。第二课:GET–基于错误–数字型现在我们尝试通过类似于输入字符串的方法来攻击应用程序,例如“abc”和“abcd”。我们注意到在lesson2中我们收到
6、了一个从数据库返回的错误。下面我们对数字做一些篡改,将'(单引号)添加到数字中。我们又得到了一个Mysql返回的错误,提示我们语法错误。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 ‘’ LIMIT 0,1′ at line 1现在执行的查询语句如下:Select * from TABLE where id =
7、 1’ ;所以这里的奇数个单引号破坏了查询,导致抛出错误。因此我们得出的结果是,查询代码使用了整数。Select * from TABLE where id = (some integer value);现在,从开发者的视角来看,为了对这样的错误采取保护措施,我们可以注释掉剩余的查询:http://localhost/sqli-labs/Less-2/?id=1–-注意:一定要在注释符号后加空格,或者URL编码后的空格(%20),否则注释符号不会产生作用。这小节中,原作者同样使用了单引号来注入,但这并不代表着这个小节,是基于字符
8、串的,大家可以观察一个单引号注入后的出错信息,''LIMIT0,1′atline1和上面我备注图中的引号个数是不一样的,稍微分析下,便可以明白。源代码中31,32行为此处的SQL查询语句。$sql="SELECT * FROM users WHERE id=$i