BUUCTF [RoarCTF 2019]Easy Calc1

1、查看题目

发现当输入字母或者一些特殊符号时,题目会报错,判断可能存在waf。通过查看源代码可以发现存在一个calc.php文件,查看可以发现calc.php确实是该题目的waf。

2、设计payload绕过waf

(1) 分析waf:由waf可知,在输入payload后,该waf会执行一个正则过滤,如果输入字符串没有匹配黑名单中的字符,则通过过虑,执行eval输出语句。

(2) 绕过waf:

内容涉及php的解析知识,相关知识如下:

PHP将查询字符串通过不同的接收参数的方式(get或post)转换为内部关联数组$_GET或关联数组$_POST。

注:查询字符串在解析的过程中会将某些字符删除或用下划线代替

php需要将所有参数转换为有效的变量名,因此在解析查询字符串的时候

①删除前后的空白符(空格符,制表符,换行符等统称空白符)

②将某些字符转换为下划线(包括空格)

(3) 由于num被过滤, 因此根据php解析规则,可以将(num)改写为( num),waf在过滤时不会发现num,但是php在解析时" num"和"num"无区别,这样就可以传入查寻字符串了。

(4) 可以通过scandir("/")来扫描整个根目录,scandir()函数相关知识。

PHP中的scandir()函数是一个内置函数,用于返回指定目录的文件和目录数组。 scandir()函数列出了指定路径中存在的文件和目录。

(5) 在该题目中可以通过scandir("/")("/"代表根目录,"~"代表家目录)来访问根目录中的所有文件,问题是waf过滤了"/"和" " ",所以不能直接使用这种方式,但可以构造以下payload来进行访问:

? num=scandir(chr(47)),利用" / "该符号的ASCII来进行转化。 

(6) 又由于scandir("/")扫描后是以数组的形式输出,所以要利用var_dump() 或者 print_r()来对内容进行输出。所以payload是:

? num=var_dump(scandir(chr(47)))    由此可以发现f1agg文件。

(7)由于system()函数被过滤,所以可以用file_get_contents()函数代替。该函数相关知识如下:

file_get_contents() 是一个 PHP 内置函数,用于以字符串的形式获取指定文件的内容。使用该函数可以读取本地的文件、远程文件和 HTTP 请求的响应等内容

 num=var_dump(file_get_contents(chr(47).f1agg))   得到flag。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值