本文基于pikachu sql-lnject
- 搜索性注入
你说了,你能搜索部分对吧,pika
这不得试试搜个%(只要你没过滤%)
没有过滤%就将会输出所以字符
- http heard 注入
先看提示
我们登录一下吧
好家伙,直接把我登录信息记下来了
看看提示
话不多说,我们去看看源代码,看看http头部注入是什么原因造成的
//直接获取前端过来的头信息,没人任何处理,留下安全隐患
$remoteipadd=$_SERVER['REMOTE_ADDR'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$httpaccept=$_SERVER['HTTP_ACCEPT'];
$remoteport=$_SERVER['REMOTE_PORT'];
//这里把http的头信息存到数据库里面去了,但是存进去之前没有进行转义,导致SQL注入漏洞
$query="insert httpinfo(userid,ipaddress,useragent,httpaccept,remoteport) values('$is_login_id','$remoteipadd','$useragent','$httpaccept','$remoteport')";
$result=execute($link, $query);
我们保守点再去看看execute是什么操作
//判断一下操作是否成功,如果错误返回bool值,如果成功,则返回结果集
function execute($link,$query){
$result=mysqli_query($link,$query);
if(mysqli_errno($link)){//最近一次操作的错误编码,没错误返回0,没有输出
exit(mysqli_error($link));//有错误,返回编码,为true,则打印报错信息
}
return $result;
}
execute只是个普通的提交操作
可能会问为何不通过用户名密码注入,不着急,我们再看看源代码
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){
//转义,防注入
$username=escape($link, $_POST['username']);
$password=escape($link, $_POST['password']);
$query="select * from users where username='$username' and password=md5('$password')";
$result=execute($link, $query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
setcookie('ant[uname]',$_POST['username'],time()+36000);
setcookie('ant[pw]',sha1(md5($_POST['password'])),time()+36000);
//登录时,生成cookie,10个小时有效期,供其他页面判断
header("location:sqli_header.php");
}else{
$html.=("<p>登录失败,请重新登录</p>");
}
}
}
啊,有个叫escap的转义函数
不着急,我们再找找
//转义,避免fuck
function escape($link,$data){
if(is_string($data)){
return mysqli_real_escape_string($link,$data);
}
if(is_array($data)){
foreach ($data as $key=>$val){
$data[$key]=escape($link,$val);
}
}
return $data;
}
看来user和password都加密了,只能从这个什么都没干的http信息下手了
那么问题来了,怎么对这些信息下手?那就需要抓包了.
这就要用到Burp Suite这个软件了
我们设置好代理(啥?你问我为啥不介绍软件怎么用?网上教程太多了,大都很详细的,我在这里主要是讲思路,并非是操作)
提交密码后
加入这些语句试试(很经典的报错注入语句)
' and extractvalue(1,concat(0x7e,(database()))) and '1'='1
提交上之后,我们可以看到直接返回了错误
这就是http头部注入,开发者为了获取http头部信息,然后将信息注入到数据库,忽于http信息的检测从而导致了这个问题的出现
- "delete"注入
我们删除一个抓下包看看
是不是很熟悉,但是php却隐藏了起来
好了,让我们直接利用GET注入的方式进行
id=-1+and+extractvalue(1,concat('~',(select+database())))
- insert/update 注入
没啥好说的
基于POST传输信息,官方提醒都是自己看着办
我之前也讲个就不说啥了.