写在前面的话
本系列教程仅以学习教育为目的,请不要用你在本教程中学到的东西去测试其他的站点,本人对此类行为概不负责。
前情提要
在《让你在游戏中变成高端黑客:SQL注入攻击全教程系列-开始游戏》中,我们介绍了有关SQL注入的一些基础知识,并且将项目的PHP代码文件安装到了我们的电脑里面,那么今天我们就以“基于错误信息的SQL注入”开始我们的系列闯关课程。
什么是SQL注入攻击?
SQL注入攻击是一种通过网站来攻击后台数据库的技术。作为一种代码注入技术,SQL注入利用的是网站软件中存在的安全漏洞。
Lesson 1:基于错误信息的SQL注入
打开localhost/sqli-labs-master/Less-1/index.php之后,你将会看到如下图所示的界面:
展开全文
界面中显示了“Welcome Dhakkan”," Dhakkan"是印度俚语,指的是“愚蠢的人”。好吧,欢迎你,小傻瓜...
根据界面提示,你需要输入一个ID作为参数,其ID为数字值。那我们按照提示输入:
?id=1
?id=1
按下回车之后,你会看到下图所示界面:
那么这一关我们就成功闯过啦!我们在URL地址后添加了一个参数,并将这个参数指向了数据库表中ID为1的记录,这样一来我们便得到了用户ID为1的用户名(Dumb)和相应的密码(Dumb)。你也可以尝试其他的数字,例如?id=2或?id=10,你将会得到不同的用户信息。
原理分析
接下来,用编辑器打开Less-1目录下的index.php,然后查看其源代码的第29行:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
我们在URL中添加了额外的ID参数之后,整个过程中后台起作用的查询语句如下:
Select * from TABLE where id=1;
Select * from TABLE where id=1;
如果你输入的是?id=999999或?id=hahahaha,你就会发现页面不会有任何的输出。但如果你在刚才的?id=1后面加个单引号(?id=1'),你就会发现系统输出了错误信息:
我们先来分析一下这段错误信息,其重点就在结尾的地方:
''1'' LIMIT 0,1' at line 1
''1'' LIMIT 0,1' at line 1
先看这个双引号括起来的数字1,噢不,其实它是由两对单引号括起来的,稍微格式化一下就变成了:
' '1' ' LIMIT 0,1 ' at line 1
' '1' ' LIMIT 0,1 ' at line 1
第一个和最后一个单引号是用来包裹出错的SQL语句的,我们可以直接去掉,然后格式化之后如下:
' 1' ' LIMIT 0,1
' 1' ' LIMIT 0,1
也就是我们刚才输入的1和一个单引号,而这个不成对的单引号破坏了原本的SQl语句执行。
这一次我们用反斜杠(MySQL的转义字符)代替刚才的单引号,并让SQL语句执行出错:
格式化之后的信息如下:
' 1\ ' LIMIT 0,1
' 1\ ' LIMIT 0,1
拿第一个例子(?id=1')来说,现在我们得想办法不让它报错,我们有两种方法去修复它。1.注释掉1'后面的语句;2.补充一个单引号与之匹配。
第一种方法就是在语句末尾添加两个破折号+空格来注释掉后面的语句:
' 1' -- ' LIMIT 0,1
' 1' -- ' LIMIT 0,1
在浏览器中,我们需要输入%20或+来代表空格符(URL编码),否则注释将无效。输入localhost/sqli-labs-master/Less-1/index.php?id=1' --%20然后按下回车:
除此之外,我们也可以通过#来完成注释。同样的,#所对印的URL编码为%23:
第二种就是在?id=1'的后面再加一个单引号,这个请同学们自己动手尝试。
目前一切进展顺利,但是你可能会有个疑问:我们这样破坏SQL语句然后又修复它们,到底有什么意义呢?
我们可以看到,我们的输入信息永远是被一对单引号(或双引号)包裹住的,无论我们输入什么内容,它都会在这对引号之中。那么当我们输入了一个单引号之后:
' '(我们输入的) '
' '(我们输入的) '
这个单引号就帮我们结束掉了左边那部分的SQL语句,接下来我们就可以在右边写我们所要执行的语句了。比如说,我们可以写上AND 1=1(这个条件永远为真),然后注释掉右侧的内容:
也就是说,变量$id包裹在单引号中(id = ' $id ')。当我们在URL地址后面添加一个?id=1' AND 1=1 ,那么id = ' $id '就会变成id = ' ' AND 1=1 ',这样就直接让id等于了一个空字符串,并运行AND后面的语句,不过由于右侧还多出了一个单引号,所以我们还得注释掉这个单引号以及它后面的内容。
' AND '1'='1对应 id = ' ' AND '1'='1 ' LIMIT 0,1
' AND 1=1 --+对应 id = ' ' or 1=1 --+ ' 被注释掉的内容
' AND 1=1 #对应 id = ' ' or 1=1 # ' 被注释掉的内容
' AND '1'='1对应 id = ' ' AND '1'='1 ' LIMIT 0,1
' AND 1=1 --+对应 id = ' ' or 1=1 --+ ' 被注释掉的内容
' AND 1=1 #对应 id = ' ' or 1=1 # ' 被注释掉的内容
总结
那么第1关就这样轻松搞定啦!希望大家能够认真学习,有什么疑问或者想法也可以在文章下方或给“安全猴”留言,第2关马上就来,之后可就没那么轻松咯!
更多国内外精彩安全资讯以及信息安全技术资源,尽在“安全猴”