宽字节注入浅浅谈!

  今天要写的是宽字节注入,这章节写的很浅,浅到让我有点不想写下去了。不过每天总要留下点痕迹吧,生命的痕迹嘛。后期我会再去补。Ok,在这里先贴出我使用的代码。

  从代码(回帖在后面)中可以看出,这是字符型注入。想到数字型注入,大家的第一印象应该就是使用来进行闭合从而完成自己注入过程。但是在这里却不行,应为这里有一个addslashes函数,它会将我们输入的进行转义,变成。这样我们的语句就会变成xxx?id=’1’’了,就算我们在最后面加入了#进行注释。但也没办法闭合。无法完成,难道这个时候就没法闭合了吗?

  不,有一种特殊情况可以支持我们注入。那就是当我们的数据库编码为GBK时,可以支持我们正常注入。只需要我们在地址后面加一个%df,然后再加单引号ok了。为什么可以这样做呢?

因为这时候的数据库编码为GBK

  在注入时大家通常都会看到自己输入的空格变成了%20。这是url转码后的值。我们的数据是转码完之后再放进数据库进行查询的。我们的输入的%df’#。首先会因为被转义变成%df\%27%27,因为url编码为%5cur编码为%23#%27。所以总的变成了%df%5c%27%23

       GB2312大家都不陌生吧?它是编码适用于汉字处理、汉字通信等系统之间的信息交换的。gb2312编码的取值范围,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE,而%5c,是不在低位范围中的。所以,%5c根本不是gb2312中的编码,所以自然也是不会被吃掉的。

  而在GBk中他是属于编码范围的,又因为GBK是双字节编码的。所以它会和前面的%df组合在一起,变成%df%5c,这是汉字“連”。这时候%df%5c’%23%27变成了連’#所以它就逃出来了,这样前面也就闭合了。闭合完之后我们的操作就和之前的一样的。

  让我们尝试查看有多少个字段试试。

      id=1%df%27order%20by%203%23

  试试4个字段id=1%df%27order%20by%204%23

  证明是有3有字段。接下来的操作就和之前一样了。

  不过要注意的一点就是,我们这些操作为的是能让这个语句闭合,从而可以继续我们的操作。如果当我们的注入语句中出现库名需要用’xx’引起来时就会出现错误。无法引用这个库。这时候我们需要利用另外一种方法:嵌套查询。就是用其他的函数来引出我们所需要用的这个库或其他东西。如:select table_name from information_schema.tables where table_schema=’sql’ limit 0,1%23  这时’sql’(假设的数据库名)就不行了。我们需要将语句换成select table_name from information_schema.tables where table_schema=select database()) limit 0,1%23 这样就可以运行了。

所以我们每学到一种方法就必须将它吃透。为什么要这样用,怎么用。这样才能慢慢变好。

  在这里贴一段困扰了我N分钟的代码,你们可以在自己那复制来测试。Select column_name from information_schema.columns where table_schema=(select databses()) and table_name=( select table_name from information_schema.tables where table_schema=(select database()) limit 0,1) limit 0,1

Pass:坚持每日一更。完毕,凌晨了睡觉觉!

<?php
//连接数据库部分,注意使用了gbk编码
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_query("SET NAMES 'gbk'");
mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");
//执行sql语句
$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;
$sql = "SELECT * FROM news WHERE id='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error());
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<title>新闻</title>
</head>
<body>
<?php
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo "<h2>{$row['title']}</h2><p>{$row['content']}<p> ";
mysql_free_result($result);
?>
</body>
</html>

原文地址:https://www.cnblogs.com/DaShuai-PX/p/9589305.html