SQL注入漏洞发现之旅
Posted 百度安全应急响应中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入漏洞发现之旅相关的知识,希望对你有一定的参考价值。
概述
易出现问题的场景
#{param}
表示对param这个参数使用预编译,而
${param}
则表示对param这个参数不使用预编译,直接拼接。
省事省力
的原则写着代码,写出了MyBatis框架最常见的漏洞点。
模糊查询
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/acb1e1cd7af1448ab18b3979319e7bab.jpg)
批量处理
ids
,例如
ids = 1,2,3,4
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/e2a2e832e1db48c7b3406923b558e8a6.jpg)
ids
,可见,这个比错误的写法多写更多的字符。![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/9f455bafe8c44662bce8665e4fa2fd4d.jpg)
接口a
,这个
接口a
可能被系统B、C、D调用,但是就是不被系统A直接使用。
接口a
未作任何防御,存在SQLi漏洞的风险时,较难被公司安全部发现。
接口a
未作任何防御,多半是存在SQLi漏洞;
接口a
到底被哪个系统调用了。
接口a
可能要在安全部黑盒测试系统B的时候,才能证明
接口a
存在SQLi漏洞;然后通知系统A的研发进行修改。
伪废弃接口
。
少做少错,多做多错
的原则小心翼翼的下线了。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/b86817f81d314339b188c8cc619c4f5c.jpg)
JAVA
为例,声明变量时便确定了数据类型,如果给的类型不一致那么便会导致错误。
id
、
number
、
pageNo
、
pageSize
等这类数字类型非常明显的参数,存在
SQLi
漏洞及
XSS
漏洞(暂不考虑
DOM型XSS
)的可能性非常小。
userId
参数是
Long
类型的,
act
参数是
String
类型的。
userId
参数通常不会存在
SQLi
漏洞跟
XSS
漏洞,而
act
参数确有测试的必要。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/6884b2fecaed443597d43d8cd5502dc4.jpg)
php
、
Python
这种弱编译型语言,则仍旧需要对数字类型非常明显的参数做测试。
Python
里面的
Django
框架
question_id
必须是
int
类型的,当给出的字符串时,便会异常,无法匹配这个接口。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/bb16a3deecd143c29656e34ea999e37b.jpg)
隐藏参数
startIndex
、
limitSize
参数,而
username
、
email
、
dep
参数都是可有可无的。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/072f71071fd049b7aefec4330a5c73ad.jpg)
RPC
那个场景所说的问题
前端固定参数
readonly
的参数、
disabled
的参数等,研发认为只能是这几个值,肯定不会有什么问题,因此认为参数可控,可以不对参数做任何处理。
楼兰:你这个漏洞没修复啊,还是存在啊
研发:不会吧,这次我在前端设置了一个下拉框,这个参数只能是固定的几个值
楼兰:这不行啊,你这个漏洞在前端做的任何限制都没用啊,攻击者直接在数据包中进行修改,不通过前端的
研发:...
HTTP Header头
Header
头中最常写入数据库的字段:
Client-ip
与
X-Forwarded-For
,用来记录客户端IP。
Client-ip
来获取IP,获取不到时,再尝试通过
X-Forwarded-For
来获取,最后才通过不可伪造的
Remote-Addr
来获取。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/296a8cd1f4f04b35a0f7b78e1a1ca67e.jpg)
时间参数
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/1a44f1e001754e3fa558a05b52502931.jpg)
MySQL中各位置的测试
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/b9b4d1418b3e42a982c888a2432ee330.jpg)
表名字段名
SELECT * FROM `bsrc` WHERE `{输入点}` = '';
where子句
普通条件
SELECT * FROM `bsrc` WHERE `bug_name` = '{输入点}';
index.php?bug_name=x
与
index.php?bug_name=x'-'x
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/6aee9d4766424c899a21a1d2c5a364d8.jpg)
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/11e187dbae094052973b8a3c0cae5660.jpg)
index.php?id=4
与
index.php?id=5-1
来查看回显的数据是否一致
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/43acb0b466524f02bf7aedf345357264.jpg)
模糊查询
SELECT * FROM `bsrc` WHERE `bug_name` like '%输入点%';
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/88b566a531d24187bbd86c6a2894b9de.jpg)
index.php?bug_name=' and '%'='
和
index.php?bug_name=' and 'x'='
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/3c39bdaa73a14eaab8dda273807fbb71.jpg)
order by子句
order by
子句出现SQLi漏洞的概率非常大。
SELECT * FROM `bsrc` WHERE `bug_name` like '%' ORDER BY {输入点1} {输入点2}
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/55ef191b5b5f4beab26a289cb1371466.jpg)
index.php?order=1,1
index.php?order=1,0
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/5f7d39e903374b088b4cf9ccbfb56ca1.jpg)
limit子句
PROCEDURE
子句、
INTO
子句;
INTO
子句来写入文件进而证明;
INTO
子句来写入文件的并且读取该文件的条件很少;
PROCEDURE
子句。
PROCEDURE
子句的详情可以看官方文档中给出的介绍。
PROCEDURE
syntax is deprecated as of MySQL 5.7.18, and is removed in MySQL 8.0.
SELECT * FROM `bug_name` limit 10 procedure analyse(updatexml(1,concat(0x7e, user()),1), 1);
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/00106d9ca5f049e1826965d95ffd93ca.jpg)
order by
子句时,可以在limit后面直接使用联合查询。
order by
子句时,那么便只能考虑前面的Payload了。
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/bcd1feb31c254fccb72cd818497b3d6c.jpg)
其他情况
index.php?bug_name=1' and if(1=2,(select 1 union select 2),1) and '
index.php?bug_name=1' and if(1=1,(select 1 union select 2),1) and '
index.php?bug_name=1' and if(1=1,(select 1,2),1) and '
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/5559b29522f4418dab067e2b7cb8748e.jpg)
一行一列
。
时间型盲注
SELECT * FROM `bsrc` WHERE `id` >= 5 AND sleep(1)
id>=5
的有2行,那么便会执行2次
sleep(1)
。
SELECT * FROM `bsrc` WHERE `id` >= 5 OR sleep(1)
id>=5
的有4行,便会执行4次
sleep(1)
SELECT * FROM `bsrc` WHERE `id` >= 5 AND (SELECT 1 FROM (SELECT sleep(1))a);
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/2a87874b0156429598abc185e5d1241e.jpg)
短路原则
SELECT * FROM `bsrc` WHERE 条件1 and 条件2
SELECT * FROM `bsrc` WHERE 条件1 or 条件2
SELECT * FROM `bsrc` WHERE `id` = {插入点};
index.php?id=1 and sleep(1)
index.php?id=1 and sleep(0)
![SQL注入漏洞发现之旅](https://image.cha138.com/20210411/0d3d023c099c4c65b4ec59048df6f6b8.jpg)
结语
百度安全应急响应中心
长按关注
以上是关于SQL注入漏洞发现之旅的主要内容,如果未能解决你的问题,请参考以下文章
[JAVA代码审计]OFCMSv1.3.3之前存在SQL注入漏洞