• BUUCTF | [RoarCTF 2019]Easy Calc 1


    发现:

    看一下页面源码,发现了提示WAF:

    calc.php?num=encodeURIComponent($("#content").val())
    

    $("#content").val() 的意思:

    获取id为content的HTML标签元素的值,是JQuery。

    $("#content")相当于document.getElementById("content");       

    $("#content").val()相当于 document.getElementById("content").value;

    但是无论怎么注入都是400,403和500,这里用的是一个新的点:PHP的字符串解析特性

    发现网页源码中有calc.php直接上链接http://11112-3f4892c5-4c06-4fa2-b6dc-8afd17a4ed88node3.buuoj.cn:28003/calc.php查看PHP源码:

    步骤:

    1.扫一下根目录,发现flagg文件:

    ? num=1;var_dump(scandir(chr(47)))

    知识点解析:(? num=1;var_dump(scandir(chr(47))))

    ①:scandir — 列出指定路径中的文件和目录。

    ②:var_dump() —  函数用于输出变量的相关信息。

    ③:chr(47) — 是指ascii码为47的字符为/而/在linux中指的是根目录。

    ④:unm=1 — 指输入的名称为1。

    总结:输出并列出指定路径中的文件和根目录。

     2.列出flagg:

    ?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

    知识点解析:(/calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))))

    ①:file_get_contents() — 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

    ②:var_dump() —  函数用于输出变量的相关信息。

    ③:%20 — 空格的html编码,如果两个空格的话就是两个%20。

    ④:chr(47).chr(102).chr(49).chr(97).chr(103).chr(103) — 指的是ascii码转换为f1agg

    总结:输出calc.php文件中f1agg目录的字符串内容。

    解析:

     为什么要在num前加一个空格?

    答:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

    发现过滤怎么办?

    答:用char()转ascii再进行拼接

    PHP的字符串解析特性是什么?

    答: PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符  2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】


    这题还可以用:http走私

    用post模式发一个请求,出现源码

    方法二

    利用HTTP请求走私

    当我们向代理服务器发送一个比较模糊的HTTP请求时,由于两者服务器的实现方式不同,可能代理服务器认为这是一个HTTP请求,然后将其转发给了后端的源站服务器,但源站服务器经过解析处理后,只认为其中的一部分为正常请求,剩下的那一部分,就算是走私的请求,当该部分对正常用户的请求造成了影响之后,就实现了HTTP走私攻击。

    添加Transfer-Encoding: chunked,在消息体加几个回车

    分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供

    作者:gtfly

    作者用的应该是CL-TE:

    所谓CL-TE,就是当收到存在两个请求头的请求包时,前端代理服务器只处理Content-Length这一请求头。后端服务器会遵守RFC2616的规定,忽略掉Content-Length,处理Transfer-Encoding这一请求头。


    参考:

    https://blog.csdn.net/weixin_44077544/article/details/102630714

    https://www.freebuf.com/articles/web/213359.html

    https://paper.seebug.org/1048/

    https://mp.weixin.qq.com/s?__biz=MzkwNzAwMDYyNQ==&mid=2247483858&idx=1&sn=19234bf6611400ae9da5d9a49a233cde&chksm=c0deaf8cf7a9269a32d928617d0c3eb11720914c591e0dc4d017450b9ef3809f2ed6a348a1b8&mpshare=1&scene=23&srcid=1016GXIy2HOar4STCzN93JIO&sharer_sharetime=1571219697654&sharer_shareid=71cadfa52e2be93573b54a69aeddea8b#rd

    http://www.gtfly.top/2019/10/19/RoarCTF-wp.html

  • 相关阅读:
    二叉树的创建、遍历、翻转
    KVO
    Objective-C Runtime 的一些理解
    深浅拷贝、copy的使用
    Python学习笔记(二)
    Python常见陷阱
    [LeetCode] 36. Valid Sudoku
    [LeetCode] 35. Search Insert Position
    [LeetCode] 34. Search for a Range
    [LeetCode] 33. Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/SpouseLJ/p/13206362.html
Copyright © 2020-2023  润新知