web-SQL注入(3)


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

后端:

MySQL命令行

(3)/**/

注释符# -- 都是把后面的语句全部注释掉了,而内联注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass

例如:?id=-1'/**/union/**/select/**/1,2,database()--+ //过滤空格,用/**/代替空格

(4)payload结尾单引号闭合

?id=-1' union select 1,2,database()'

GET传参

总结:

总结


文章作者: 17mie32
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 17mie32 !
  目录