学习笔记:宽字节注入

喜欢悠哉独自在   ·   发表于 2022-03-20 17:37:15   ·   学习杂记

一、魔术引号是什么

1、我们现在要了解一个PHP的防御函数
magic_quotes_gpc(魔术引号开关)

2、magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据
如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

3、单引号(’)、双引号(”)、反斜线(\)等字符都会被加上反斜线
magic_quotes_gpc的作用:当php的传参中有特殊字符就会在前面加转义字符“\”,来做一定的过滤

4、单引号和双引号内的一切都是字符串,那我们输入的东西如果不能闭合掉单引号和双引号,我们的输入就不会当作代码执行,就无法产生SQL注入,那我们该怎么办?

二、什么GBK编码格式

1、尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国家规范。
但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如我国的gbk、gb2312,作为自己默认的编码类型。
也有一些cms为了考虑老用户,推出了gbk和utf-8两个版本(例如:dedecms)

2、我们就以gbk字符编码为例,拉开帷幕。gbk全称《汉字内码扩展规定》,gbk是一种多字符编码。他使用了双字节编码方案,因为双字节编码所以gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。我们可以通过输出来验证这句话。
例如:0xD50X5C 对应汉字 “ “,URL编码用百分号加字符的16进制编码表示字符,于是%d5%5c经URL解码后为“誠”

三、宽字节SQL注入的原理

1、前面讲到了GBK编码格式。GBK是双字符编码,那么为什么他们会和渗透测试发送了“巧遇”呢?

2、宽字节SQL注入主要是源于程序员设置数据库编码为非英文编码那么就有可能产生宽字节注入
例如说MySQL的编码设置为了select names ‘gbk’ 或是 select character_set_client =gbk, 这样配置会引发编码转换从而导致的注入漏洞。

3、宽字节SQL注入就是PHP发送请求到MySQL时使用语句
select names ‘gbk’ 或是 set character_set_client =gbk进行了一次编码,但是又由于一些不经意的字符集转换导致了宽字符注入。

四、课堂笔记部分

(一)SQL注入

id传参1" class="reference-link">1、select*from news where id=’1’ => id传参1

闭合单引号,注释掉后面的单引号(让我们的输入跳出单双引号)

至今" class="reference-link">2、SQL注入:1998 => 至今

低版本 修改配置文件然后强行执行
magic_quotes_gpc
高版本 删除掉了这个配置,通过特定函数使用
addslashes()

3、魔术引号:不让你闭合?绕过

(1)不需要闭合

select * from news where id=1

(2)仔细查看作用域

$_SERVER

(3)宽字节注入

二进制(数字)" class="reference-link">4、无论是什么 => 二进制(数字)

ascii 数字" class="reference-link">(1)汉字 => ascii 数字

多个字符组在一起成为一个字" class="reference-link">(2)多字符编码 => 多个字符组在一起成为一个字

GBK = 双字符编码

(3)产生歧义:下雨天留人天留我不留

abcd (中文解码)" class="reference-link">(4)英文编码:abcd => abcd (中文解码)

(5)编码不同歧义

单字节(ascii能找到的全是单字节)
\ => 92 单字节 =>双字节
select * from news where id='1?\''
URL编码 => 16进制

(6)数据库使用GBK编码可能存在宽字节注入

传一个字符将反斜杠吃掉成为汉字
尝试 => 我试试看宽字节

\ => %5c
%df\ => 凑成汉字
%df%5c =>运
%9c%5c
\' => 都是字符串

(二)替代法

user表

(三)16进制法

1、mysql他支持16进制输入 替代字符串

2、有时候SQLmap需要手动帮助闭合

%df = URL编码后的内容

(1)直接改hex

(2)还有更骚的方法:传参汉字

gbk => %e8%81%82%5c => 两个汉字
3+1=4/2=2字符

(四)总结

1、union 联合查询 GET注入

2、工具使用(谷歌浏览器插件、burp、sqlmap)

3、updatexml报错注入 POST/head传参

4、盲注 (布尔、时间)ascii substr sleep concat

if group_concat 子查询

5、宽字节:绕过魔术引号 %df或者任何能喝\结合的东西、汉字、16进制编码0x 子查询的嵌套

(1)找不需要闭合
(2)找作用域
非utf-8,非英文编码都可行 数据库的设置
和前端、后端都没啥关系,核心是数据库的编码
前端页面GBK 数据库GBK的可能性很大

用户名金币积分时间理由
woke 16.00 0 2022-03-22 11:11:40 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2022-3-20 | 872 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.