前面简单的略,记点备注,不能局限于
DVWA
,补一下基础一般来说提交
id=-1
防止请求的输出占据注入输出的位置不能用
#
注释了,换用--+
,其中+
是url
编码中的空格对库名查询的时候要
group_concat(table_name)
,否则只会输出第一个表名下面很多题都有关键词替换,双写绕过或者大小写
对于过滤了空格,可以用空格的
url
编码%0a
绕过
$less6$ 报错注入
先试出是双引号闭合,
id=1"
发现不能判断回显位报错注入:通过特殊函数错误的使用,使其输出错误结果
BigInt
(虽然这个不能用)exp(int)
计算e
的次方,足够大的x
会使函数的结果数据类型溢出导致报错,例:1
?id=1 and exp(~(SELECT * FROM (SELECT user()) a)) --+
将
a
作为SELECT user()
语句的结果,并用SELECT * FROM
查询查询语句成功执行返回 $0$ ,所以取反作为
x
,使数据溢出同理
pow()
也可以仅当
MySql
版本在5.5.5~5.5.49
函数参数格式错误
用到了
updatexml()
与extractvalue()
updatexml(XML_document,Xpath_string,new_value)
:分别是文档对象名称,字符串,格式,例如下:1
/?id=1 and updatexml(1,concat(0x7e,user(),0x7e,version(),0x7e),3) --+
虽然这题是双引号闭合,但加上以后代码块不能高亮了
0x7e
是ASCII
下的~
,习惯把它放在注入函数的两端用以区分系统报错和所需信息主键重复(冲突)
鸽,等我遇到题再说
$less29/30/31$
http
参数污染参数污染:
HTTP
允许提交同名参数,而服务器及安全狗WAF
的选取参数不一致,导致可以绕过WAF
而提交渗透指令例:提交
/?id=111&id=222
不同类型服务器会选取
111
或者222
或者两者都有作为id
值,具体如下表当
WAF
被架设在Tomcat
上,而服务器在Apache
上时,可以在前一个提交合法参数,后一个提交渗透指令来绕过WAF
但令人感慨的是
less29/30/31
并不需要绕过(大嘘$less32/33/34/35/36/37$ 宽字节注入
原理:
PHP
自带了如addslashes()
等转义函数,通过在'
前面加上反斜杠变为\'
将其转化为字符串,防止闭合。而当服务器端编码方式为gbk
时,可以通过加上特殊字符与反斜杠构成中文来绕过转义若服务器存在指令
1
2
3SET NAMES 'gbk'
或者
SET character_set_client =gbk则存在该漏洞
比如被转义成的
\'
在gbk
下编码为%5c%27
如果我们提交
%bb'
转义编码后为%bb%5c%27
,当ASCII>128
时,sql
会认为前后两个共同组成一个汉字,即%bb%5c
是一个宽字符,以此绕过对'
的转义值得注意的是并不一定使用
%bb
,只需要满足存在后一个编码为%5c
的宽字符即可,理论上%81-%FE
均可注意第 $34$
输入被当作了字符串而非在
url
栏中输入时转为 $16$ 进制但
burp
抓包提交就神奇的可以了,其他绕过包括改burp
中的HEX
直接改十六进制,以及提交汉
,原因是存在需要三个编码的汉字,汉
恰好是前两位,加上%5c
后能构成新的汉字注意第 $35$
逆天惯性思维,注意标题
who care for addslash()
数字型,直接注入
$less38/39/40/41/42/43/44/45$ 堆叠注入 stacked injection
通过在
sql
语句后面加上;
可以同时执行多条语句,这与union select
的区别是union select
只能执行查询语句,而堆叠注入可以执行任何操作但需要注意的是,第二条语句以后常常没有回显,而由于权限不足,可能执行的操作没有成功而无法得知
其局限性还在于数据库引擎或者
API
可能不支持,如Oracle
注意 $less43$ 在
username
处进行了过滤,那么通过passwd
处注入即可