作者:sai52.B.H.S.T.
前言
之前在.mysql下读取文件的多少种方法及利用.一文中提到在mysql注入中实践上应当可以导出可执行二进制文件到启动项的说法,现给出原理及实例供大家参考。
MYSQL注入中导出文件需满意的条件大家都晓得,就未几说了,要导出可执行二进制文件还需注入点必需存在二进制编码格局数据类型的字段如BLOB或LONGBLOB数据类型。要导出可履行bat文件对字段的数据类型不请求。其余一些附加限度前提依环境而定。
在注入页面无法爆出物理路径的情况下,假如知足上述条件,可以斟酌用这种办法得到权限。
实现原理
将可执行文件用HEX()编码后,分段导出并UNHEX()解码所有HEX()编码后的文件分段,在导出的文件中重组为完整的文件。
相干以下几个方面的常识,不懂可以参考。
1. 不同数据类型的字段可存储同种编码方式的数据
MYSQL数据库中,要存取不同编码方式的数据,列数据类型必须与欲存取数据的编码方式绝对应。当表中各不同数据类型的列中存储的数据采取统一种编码方式时,只管各个列的数据类型不同,此时表中只有一种编码方式。因此当把一个文件按数据表中的列数分为多段并以同种编码方式存储于各不同数据类型的列中时,若将全部数据表中的数据按列次序导出到同一个文件中,就可以重组还原成同一编码的完整文件。HEX编码方式役属于简直所有数据类型,在 int,text,blob,data ...等数据类型中,在其存储范围内,被hex()编码过的文件都可以正当存储。
2. 各数据类型的存储规模
咱们平时在注入中应用UNION查问个别都采用数字匹配字段的方式以到达select_expression的实用条件即UNION后面查选的字段数目、字段数据类型都应该与最前面SELECT的一样,这是因为数字役属于几乎所有数据类型,因此可以匹配任何字段,HEX编码方式同样役属于几乎所有数据类型,因此我们可以把一个文件用HEX()函数编码,接着把编码后的文件按数据表中的列数分为多段数据,每一段数据按顺序匹配对应字段,结构注入 URL,导出完整的文件。
在把HEX()编码后的文件分段时,须要懂得各数据类型的存储范围,从而断定注入点各字段容许提交数据的长度跟可存储编码范围,以便把最长的分段数据放在存储范围最大的数据类型的字段上。具体请参照.MySQL数据类型简介.www.sai52./archives/769/。
3. UNION的特征导致的不同注入点应用方式
MYSQL只要数据能在对应数据类型的列中完整存储,就可以导出任意文件名的完整文件。也就是说,我们把二进制文件用HEX()编码后可以存储在TEXT数据类型等非二进制编码的字段上,导出时UNHEX()解码仍然能保留为完整的二进制文件。如
mysql create table a (id int,cmd TEXT);
mysql insert into a (id,cmd) values (1,hex(load_file(\'c:\\windows\\system32\\regedt32.exe\')));
mysql select unhex(cmd) FROM a where id 1 INTO DUMPFILE \'d:\\regedt32.exe\';
语句中unhex(cmd)已经转变了所选字段的数据类型为二进制,因此可以导出完整的二进制文件,而在注入中我们用UNION衔接SELECT语句时,UNION后面查询的字段数量、字段数据类型都得与最前面的SELECT一样,此时
SELECT cmd FROM a where id1 and 12 UNION SELECT unhex(cmd) FROM a INTO DUMPFILE \'d:\\regedt32.exe\';
语句中unhex(cmd)字段的数据类型与最前面的cmd字段的数据类型不同,二进制编码的数据无奈在TEXT数据类型中完整贮存,因而无法导出完全的二进制文件。要导出完整的二进制文件,最前面SELECT所选的字段中必须有以二进制存储数据的数据类型,如BLOB,LONGBLOB等。导出 bat文件无此要求,任何类型的字段只有在其存储范畴内都能够。
4. INTO DUMPFILE 的特性
如果使用INTO DUMPFILE导出数据,则MySQL只把一行写入到文件中,错误任何列或前进行终止,也不执行任何本义处置。INTO DUMPFILE 的这个特性说白了就是“无缝连接”,它既可以用于从列中导出数据到文件,也可以用于从表中导出数据到文件。
UNHEX()函数执行从HEX()的反向操作。就是说,它将参数中的每一对十六进制数字懂得为一个数字,并将其转化为该数字代表的字符。成果字符以二进制字符串的情势返回。0x与UNHEX()意思雷同。
当表中的各个不同数据类型的列顺次存储了所有的HEX编码后的文件分段时,用SELECT 0x文件十六进制数据part1,0x文件十六进制数据part2,0x文件十六进制数据part3,....0x文件十六进制数据partN INTO DUMPFILE 的方式导出表中全体数据到一个新文件,此时各个列中的HEX编码文件分段分辨被还原到新文件中的对应顺序局部,之后被“无缝连接”在一起,构成一个与原文件编码方式及大小截然不同的新文件,被保存到你想要它去的处所,比方启动项。
5. GET与POST方式提交数据的限制
注入点多以GET方式获得数据,而GET方式恳求的URL长度受特定的阅读器及服务器两方面的制约留神这个限制是整个URL长度,而不仅仅是你的参数值数据长度:
如果URL的长度超越客户端浏览器限制,提交时浏览器无响应。
如果URL的长度超出服务器限制,服务器不处理要求,返回过错提醒“Url Too Long”。
GET方式提交超长URL时,倡议使用NC或数据提交工具。
经由试验得悉,用GET方式传递WEB页面参数时服务器许可的最大值为16000字节左右WIN2003+IIS环境,也等于说,导出的可执行二进制文件在7.9k以内时,可以畸形导出。如果是POST方式的注入点,提交数据的最大长度只受限于服务器设置,如php.ini的设置等。
6.MYSQL默认字符集对导出路径中双字符编码的影响
mysql5供给了几个设置字符集的体系变量,其中character_set_client的值是MYSQL用来取得客户端传递数据的字符集的。
MYSQL默认装置设置是latin1的瑞典语排序方式,当我们依照默认设置方式通过PHP存取MySQL数据库时,无论通过哪种方式的编码发送查询,MYSQL都以为传输过来的数据是latin1编码。
网页提交的双字节字符编码数据如中文,日文,韩文等,在服务器没有进行特别设置的情形下被提交后被默认是UTF8编码与提交时设定的编码无关,MYSQL按本身默认的latin1编码来读取,双字符编码的文字必定会显示为乱码,这样在用INTO OUTFILE 或 INTO DUMPFILE 导出数据到文件时,导前途径中的双字符编码文字就会显示为乱码,导致MYSQL由于找不到显示成乱码的门路而导致导出文件失败。