1.简介(文章中的堆查询其实就是联查)
这个文章主要描述怎样再LAMP和WAMP平台上实施远程命令执行代码通过SQL注入漏洞。攻击者再MySQL平台上进行SQL注入必须处理一
些限制和约束。例如,在一个不流行的平台中进行远程命令执行漏洞的一些查询语句缺乏复杂的声明,相对其他平台来说。再最近的这
些年一些人开始仔细研究,这些人专注于利用SQL注入漏洞进行随心所欲的代码执行漏洞。然而,这些类型的攻击集中在支持堆查询
DBMS连接上。这个文档将会解释怎么使用不同的方法去完成那些不支持堆查询的DBMS连接,并且得到跟支持堆查询的DBMS相同的结果
。
2.描述
SQL注入漏洞是把恶意代码注入到正常的SQL查询中的一种攻击方式.SQL注入攻击允许恶意的用户去得到数据库的结构和挖掘出宝贵的
应用操作系统环境。
运行命令执行漏洞已经被证实了是最高级别的恶意用户去获得成功的SQL注入攻击行为。
Mysql是在LAMP和WAMP上最流行的数据库服务器软件套件。DBMS连接默认是不支持堆查询。这就使得一些技术去实施远程代码执行漏
洞的条件是在某些平台需要支持堆查询。
3.堆查询
堆查询是一个去定义是否数据库连接层某个时刻能运行多于一个的查询语句。每个查询用分号分隔开。
下面的就是再SQL注入攻击中的一个堆查询的例子
SELECTnameFROMrecordWHEREid=1;DROPtablerecord;DROPtableaddress--
在上面的例子中,在同一时刻这里有三个分离的查询请求。第一个查询是来自现实中应用程序的正常查询。这个查询允许进行数据库
查询,然而当堆查询默认进入Mysql-php应用,一个错误信息将会被应用程序返回,同时没有任何语句被执行。
4.攻击应用程序上不支持Mysql堆查询的方法
已经被发现的MysqlUDF(UserDefineFunction)库创建技术,它能被用在支持堆查询的应用上进行远程代码命令执行漏洞。这个技术
已经再数据库黑客大曝光做了详细解释。
在Blackhat2009欧洲大会上,BernandoDamele解释了相似的技术。下面的步骤来自于它的whitepaper
1)创建一个字段的表,数据类型是longblob
2)把本地文件的内容进行对等的16进制的转换。
3)切分16进制的字符串到1024字符长的大块
4)INSERT第一个大块进支持表的字段里面
5)UPDATE其他的大的块添加到这个表的字段里面
6)导出表中的字段中的16进制的文件的内容到一个指定的目标文件路径,使用的方法是SELECT'sINTODUMPFILE.再Mysql上这个是可
以实现的,一个查询例如SELECT0x41将会返回ASCII字母编码A。
这里有一些环境去实施这个堆查询
1)DBMS连接必须支持堆查询
2)Session用户必须有FILE,INSERT,CREATE和UPDATE权限
3)再一些低于Mysql5.1.19的版本中,工项目路径必须对于Session用户可写。
4)再高于Mysql5.1.19的版本上,系统变量plugin_dir必须存在并且对于Session用户可写。
现在大家已经知道了这个技术有一些限制,默认的,作为mysql用户启动的LinuxMysql共享库的路径是不可写的。
然而这个特性并不适合于Windows。默认windows的Mysql运行账户是LocalSystem,也就是说文件可以被用户创建到任何文件夹。最
新的Mysql版本,系统变量plugin_dir已经不存在了,这个目录可以创建同时可以被Session用户写入。
5.攻击Mysql不支持堆查询的方法
由于再Mysql-PHP平台上不支持堆查询,运行另外一个查询再正常的语句后是不可能的。然而运行另外一个SELECT查询是可以使用
UNION语法的。UNION语法是合并多个SELECT查询到一个单独的结果中。
Mysql5.1的官方手册(省略自己去官方看SELECTG语法)
从上面可以看到我们可以通过UNIONSELECT使用SELECTINTODUMPFILE去把可执行的文件上传到数据库服务器上。当注入这个查询的
时候,只有唯一的语句可以创建全部的文件。同样的,这个文件不能被另外一个SELECTINTODUMPFILE语句覆盖掉。
来自Mysql官方文档
OnlythelastSELECTstatementcanuseINTOOUTFILE/DUMPFILE.(However,theentireUNIONresultiswrittentothe
file.)
由于UNION查询的特定,数据将会写入到文件中。
例如
SELECTcontentFROMdataWHEREid=21UNIONSELECT0x8A789C.......INTODUMPFILE‘file’
第一个查询返回任何数据,这个数据将会覆盖文件头部。预防这个的方法就是,我们可以再WHERE字段插入任何不存在的值所以没有
数据从这个查询冲被取出。
这个文件可以被运行再WEB目录里面,在这个例子里面DBMS连接不支持堆查询,所以最好的方法是上传文件到ApacheWEBserver目录
,然而这个只可能再mysql数据库和WEBSERVER再同一个机器上。PHP脚本可以运行SYSTEM函数。同样的这个技术也有一些限制:
1)必须知道Apache的WEBSERVER目录
2)Session用户必须有FILE权限
3)Session用户可以访问上传到WEBSERVER服务器的目录的文件。
自己补充一个4)GPC为off
6.WEB服务器目录的指纹
在一些实例中WEB服务器的主目录不是默认安装的目录,指纹获取可以被用于获取这个信息,这里主要有2个方式去找到WEB服务器目录
的指纹。主要是通过应用程序返回的错误信息可以得到这个指纹。
6.1通过错误信息方法或者指纹
默认的PHP关闭了错误信息。这里有多种方法去返回包含WEB服务器目录的错误信息。例如,再SQL语句部分输入一个单引号,错误信
息就暴露出来了。下面有一个使用'出错的例子
Fatalerror:Calltoamemberfunctionexecute()onanon-objectin/var/www/output.php
online15
6.2通过LOAD_FILE方式获得指纹
LOAD_FILE可以去读取数据库服务器上的文件。去使用这个过程,Session用户必须有文件权限。这个文件同时对于所有用户可取同时
文件的大小必须要小于Apache配置文件中的max_allowd_packet的大小。再Apache配置文件中DocumentRoot指令包含了ApacheWEB服
务器的主目录。
这里有一个用LOAD_FILE去读APACHE配置文件的例子,默认安装的UbuntuLinux
SELECTLOAD_FILE('/etc/apache2/sites-available/default')
7.最大的恶意代码运行的大小
Apache中的LimitRequestLine指令允许WEB服务器去削减HTTP请求的大小。这包含了所有的通过GET请求发送的请求信息,默认值是
8190Bytes。如果SQL注入再GET请求上同时这个恶意代码超过了这个大小的话,ApacheWEB服务器将会回复一个HTTP414的状态码。
。
默认的ApacheWEB服务器设置LimitRequestBody为2GB,这个是HTTP请求的body体中的大小。所以SQL注入发送到POST请求里面,可以
给恶意代码提供2G的发挥空间。
WEB应用防火墙可以去禁止打的请求。这个长的请求也可以是缓冲区溢出攻击。
8.恶意代码的压缩和解压缩。
PHP包含了一个zlib的模块可以去读和写gzip压缩文件。这个模块可以把一个恶意文件通过压缩成一个非常小的文件。Zlib模块可以
压缩我们的文件从9635字节到630字节。当压缩文件成功上传到WEB服务器上以后,gzuncompress过程可以反解码出这个文件。当然条
件还是Mysql数据库和ApahceWEB服务器再相同的机器上。
9.处理字段
UNION字段将会联合从复合的SELECT语句中连接到一起。这两个查询必须有相同的字段数。
例如
SELECTname,add,contentFROMdataWHEREid=21UNIONSELECTNULL,NULL,
0x8A789C.......INTODUMPFILE‘file’
第一个的查询的结果将会加入到我们的文件中。我们再第五部分讲过,我们可以再WHERE字段插入任意不存在的值,所以再第一个查
询中是没有任意结果的。然而,由于再这个查询中需要额外的字段请求,任何坏的字符数据被加入到了我们的文件中。
我们可以用一下方法查询
SELECTname,add,contentFROMdataWHEREid=4444UNIONSELECT
0x8A789C.........,0x00,0x00INTODUMPFILE‘file’
另外一种方式是SELECTname,add,contentFROMdataWHEREid=4444UNIONSELECT0x8A,
0x78,0x9CED......9EEC.......INTODUMPFILE‘file’
10.再LAMP平台上进行远程代码执行漏洞。
在LAMP平台上进行远程代码执行漏洞有一些限制,默认的mysql是以mysql用户启动的。恶意文件通过SELECTINTODUMPFILE必须需要
Mysql用户有写权限。默认的上传的文件是不可以运行的,但是可以读的。文件属组是Mysql用户。PHP脚本可以读这个文件和写个相
同内容的新文件。这个文件创建所有者是www-data用户,PHP文件的权限可以通过运行PHPSYSTEM函数进行修改。
11.在WAMP平台上进行远程代码执行
远程代码执行漏洞再WAMP上只有少数的限制。默认mysql是作为本地系统管理员用户登录的,默认的上传的PHP脚本可以添加用户,增
加服务器等操作。
参考:
[1]LAMP
http://en.wikipedia.org/wiki/LAMP_(software_bundle)
[2]WAMP
http://en.wikipedia.org/wiki/WAMP
[3]StackedQueries
http://www.sqlinjectionwiki.com/Default.aspx?Page=Stacked%2
0Query&AspxAutoDetectCookieSupport=1
[4]MySQL5.1ReferenceManual:AddingNew
Functions
http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html
[5]DatabaseHacker’sHandbook
http://www.ngssoftware.com/press-releases/database-hackershandbook-
published/
[6]AdvancedSQLInjectionExploitationtoOperating
SystemFullControl
http://www.blackhat.com/presentations/bh-europe-
09/Guimaraes/Blackhat-europe-09-Damele-SQLInjectionslides.
[7]MySQL5.1ReferenceManual:INSERTSyntax
http://dev.mysql.com/doc/refman/5.1/en/insert.html
[8]MySQL5.1ReferenceManual:UPDATESyntax
http://dev.mysql.com/doc/refman/5.1/en/update.html
[9]MySQL5.1ReferenceManual:SELECTSyntax
http://dev.mysql.com/doc/refman/5.1/en/select.html
[10]MySQL5.1ReferenceManual:Privileges
ProvidedbyMySQL
http://dev.mysql.com/doc/refman/5.1/en/privilegesprovided.
html
[11]MySQL5.1ReferenceManual:CREATE
FUNCTIONSyntax
http://dev.mysql.com/doc/refman/5.1/en/create-functionudf.
html
[12]SharedLibrary
http://en.wikipedia.org/wiki/Library_(computing)#Shared_librari
es
[14]MySQL5.1ReferenceManual:UNIONsyntax
http://dev.mysql.com/doc/refman/5.1/en/union.html
[15]PHPSystemFunction
http://ar.php.net/system
[16]MySQL5.1ReferenceManual:StringFunctions
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html
[17]ApacheCoreFeatures
http://httpd.apache.org/docs/2.1/mod/core.html#documentroot
[18]PHPZlibFunctions
http://www.php.net/manual/en/ref.zlib.php
[19]PHPgzcompressFunction
http://www.php.net/manual/en/function.gzcompress.php
[20]PHPgzuncompressFunction
http://www.php.net/manual/en/function.gzuncompress.php
[21]Adler32Checksum
http://en.wikipedia.org/wiki/Adler-32
[22]RFC1950
http://tools.ietf.org/html/rfc1950
¥48.00¥180.00
¥199.00
¥29.90
¥798.00
¥199.00
¥48.00¥180.00