CTF Web安全

Mysql with rollup注入(ISCC-2018 线下赛 Web 私地一)

Posted on 2020-01-03,3 min read

打开题目。index.php登陆界面。尝试register.php。提示:注册已经关闭

<form action="register.php" method="GET">
	用户名:iscc_<input type="text"  name="uname" placeholder="请输入四位数字" />
	<br/><br/>
	密码:<input type="password" name="pwd"/>
	<br/><br/>
	<input type="submit" value="注册">
</form>

从这看出来了。用户名是四位数字
简单测试下。登陆界面存在注入。过滤很多关键字。
响应头发现hint

$sql="SELECT pwd FROM user WHERE uname = '{$_POST['uname']}'";
$query = mysqli_query($con,$sql); 
if (mysqli_num_rows($query) == 1) { 
    $key = mysqli_fetch_array($query);
    if($key['pwd'] == $_POST['pwd']) {
        echo "xxxxxxxxx";
    }else{
        echo "你这密码不太对啊";
    }
}else if(mysqli_num_rows($query) == 0){
	echo "你这密码不太对啊";
}
else{
	echo "数据太多了";
}

部分源码:
查询纪录要=1
用户提交的密码=查询结果的密码
这里使用==。弱类型比较
由于关键字较多都被过滤。这里就要学习下新的注入姿势
group by … with rollup
group by … with rollup主要是用于统计数据的
普通的group by语句。用来排序。

group by 字段 with rollup
用来计算字段的平均值

那么这与这题目有什么关系呢。
查看题目源码。我们无法得知用户密码。但是要构造密码==POST密码
想到了NULL。通过查询使得用户密码为NULL而不是空
满足了查询字段为1,并且NULL与空。弱类型比较相同
OK。我们来构造下
方法一:
利用异或。1^1=0=字符串 弱类型
limit 1 offset 1=limit 1,1

方法二:
前面说了。用户名是四位数字。当我们输入正确用户名时。返回结果就是null

注入成功会输出一个字符串

+ADg-d+ADIAMA-d+ADUANw-e+ADI-f+ADIAYgA5AGI-e+ADUALw-f+AGIAMwAw-e+ADcAMA-f+ADcAOAAxADMANAA4ADk-dd+AGE-e+ADcAOQBi-e+ADAANwA5ADIANQBhADMANABhAC4AcABoAHA-

纪录下这是utf-7编码。
http://toolswebtop.com/text/process/decode/UTF-7

<?php
show_source(__FILE__);
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");
?>

得到webshell
)闭合vardump();
eval("var_dump($a);system('ls');");

下一篇: Pwn(绕过canary保护机制)→