(全文以MySQL为例)
一.联合注入
1. 简单原理
在sql的查询语句中,union,是一个极度危险的函数。
其会将后面的语句作为sql命令执行,拼接到前面正常的结果集后。
例子:
1 | select * from usr union select 1,2; |
1,2表头被拼接起来(这里的1,2实际上不存在)
那么加上恶意的查询
1 | select * from usr union select * from home; |
很明显,命令被执行了。
当然这只是理想情况,在实际的开发环境中我们几乎不可能知道这个表有几行几列,这个表叫什么,查询语句的格式等等……
而正因为如此,其为我们进行漏洞注入提供了思路。
2. 联合注入的步骤
- 判断数据类型
- 查列数
- 却定字段的位置
- 查表名
- 查列名
- 获取数据
先根据以下语句的变化进行一个简单的理解:
1 | select * from users where id=$id |
我们拿id=’1’来举例子
1 | select * from users where id='1'; |
最后,前方的‘1’闭合完成语句,后方把不符合语法的多余部分注释掉,完成联合注入
ok,我们回到正题,首先第一步:
判断数据类型,其实就是通过测试包错来试出他的包裹结构
还记得上面的例子吗,包裹一共最基本也就4种形态
不外乎(1), ‘1’ ,”1” ,1 。
当然这些都是可以相互嵌套的,能整出很多花样
一个例子,抑或是一个思路
1 | -- 当我们传参?id=1时,有 |
好,重点来了,根据报错信息,是出现了’1’’,所以断定为’1’包裹。
当然,有的情况是报错不会给出这么详细或是干脆没有报错。并不碍事,照着刚才的思路,先根据四种基本包裹一步一步慢慢排除
这里给一个模板,以后做手注盘判断时可以直接拿来用
- select * from users where id= 1
- select * from users where id=’1’
- select * from users where id=(‘1’)
- select * from users where id=”‘1’”
- select * from users where id=(1)
- select * from users where id=((‘1’))
- select * from users where id=(“‘1’”)
- select * from users where id=”1”
慢慢试,排除哪个就注释哪个(后面我们学到sqlmap时就不用这么麻烦了,这么做更多的是锻炼思维)
二.
1.
2.
3.
三.
1.
2.
3.
四.
1.
2.
3.
五.
1.
2.
3.
About this Post
This post is written by void2eye, licensed under CC BY-NC 4.0.