1、参数类型
(1)数字型
数字型一般是没有符号,也就是一般是不需要闭合的。数字型也是可以加符号的。
select * from user where id=1
(2)字符型
字符型是会有引号,所以在注入的时候需要闭合引号,以及注释多于的符号
干扰符号:单引号,双引号,百分号,括号(小括号,花括号)
百分号:SQL语句中的搜索符号(类似于Windows的星号)
?x=xxxx
select * from user where name like '%xxxx%'在搜索的时候前后有此关键字的都可以被搜索到
select * from user where name = 'xxxx'
$name = $_GET['X']
$sql="select * from user where name='$name'";
?x=xxx and 1=1
select * from user where name='xxxx and 1=1'此情况下and 1=1的判断效果就没了
?x=xxx' and 1=1--+注释掉了后面的单引号
select * from user where name='xxxx' and 1=1
(3)JSON类型
json={"username":"Dumb' and 1=2 union select 1,database(),3#"}
键值对:{'user':'xxxx'}
2、请求方法
From:https://www.jianshu.com/p/a5cdfd2bda66
可以在Request Headers处查看
(1)GET请求
GET请求也可传参到后台,但是其参数在浏览器的地址栏的url中可见,且参数长度也是有限制的。
GET 请求可被缓存
GET请求只能进行url编码
GET请求比较常见的方式是通过url地址栏请求
GET前面无论是什么请求,只要它存在于URL中即可显示
(2)POST请求
POST请求传递参数放在Request body中,不会在url中显示,比GET要安全,且参数长度无限制
POST支持多种编码方式(二进制数据使用多重编码。)
POST 请求不会被缓存
POST最常见是通过form表单发送数据请求
(3)COOKIE
Cookies是数据包里的参数,存放一些用户信息以便于让Web服务器辨别用户的身份。
可接收GET、POST等请求
$c = COOKIE['x']
echo $c
(4)REQUEST请求
GET、POST、COOKIE等都可接收
(5)HTTP头
$_SERVER:获取系统的值,当前用户IP地址,浏览器语言等
$s=$_SERVER['HTTP_USER_AGENT'];
echo $s;
3、注释符号
From:https://www.cnblogs.com/impulse-/p/13184023.html#gangkong
将后面不需要的语句注释掉,以保证SQL命令的完整性
(1)--后面有空格(--+)
(2)#
URL中#号作为锚点,不当做数据来传输
命令传到后端,少了一个单引号用来闭合命令(可以利用这种特性,在URL中命令结尾添加一个单引号来代替注释符)
解决:直接在URL中使用#号有问题,可以把#号转换成URL编码(%23)
传输过程对单引号还有空格进行了URL编码,在前端注释符使用URL编码,传输过程中把URL编码带上,到后端就会进行一次URL解码操作,#号注释符起作用。
前端:?id=-1' union select 1,2,database()%23
后端:

(3)/**/
注释符# -- 都是把后面的语句全部注释掉了,而内联注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass
例如:?id=-1'/**/union/**/select/**/1,2,database()--+ //过滤空格,用/**/代替空格
(4)payload结尾单引号闭合
?id=-1' union select 1,2,database()'

总结:
