BUUCTF 之 代码审计知识点总结

[HCTF 2018]WarmUp

  1. isset($a)判断a是否声明(有值)
    is_string($b)判断b是否是字符串
    in_array($c,$d)判断c是否在b数组里有。
    mb_substr($e,x,y)把字符串从x开始截取y位。(第一位是0)
    mb_strpos($f,$g)找g在f里出现的第一次位置,没有则返回false。(第一位是0)

[ZJCTF 2019]NiZhuanSiWei

1.伪协议: 在这里插入图片描述
具体内容可见链接: https://www.cnblogs.com/zzjdbk/p/13030717.html

  1. 注意使用伪协议时几乎都得用base64编码,别怕麻烦。
  2. 没有源码时可以利用php://filter读取源码。
  3. 向网站文件写内容用data协议。
  4. 注意当页面由于传参变化时,要注意读取源代码或者抓包,本题就是在最后把flag放在源代码注释中。

[极客大挑战 2019]PHP

  1. __sleep:在序列化时执行,处理序列化的字符串。
    __wakeup:在反序列化时会先执行,来充填反序列化对象。 绕过方法他的方法:当反序列化字符串中给出的属性个数大于实际应该的参数个数,就会被跳过。
  2. 反序列化字符串:
    O:类名长度:“类名”:属性个数:{s:属性名1长度:“%00类名%00属性名1”;s:5:“admin”;s:属性名2长度:“%00类名%00属性名2”;i:100;}
    其中s表示字符串,i表示整数,O表示对象,s后面需要跟字符串长度和名称,i后面只有值。
  3. 爆破目录:经常性失效,需要多试几次才行。

[ACTF2020 新生赛]BackupFile

  1. PHP有弱类型比较,分两种等号,
    其中==在比较时候是先将字符串类型转化为相同,再比较;===是先判断两种字符串的类型是否相等,再比较
  2. 在==转换字符串的过程中,遵循如下原则:
    当字符串开始部分不存在数值的时候,会将该字符串转换为数值 0。如var_dump(‘abc’ == 0),结果为 True
    当字符串开始部分有合法数值的时候,会将该字符串转换为合法数值。如var_dump(‘123abc’ == 123),结果为True
    当字符串中包含 e 或者 E 时,会将其识别为科学计数法。如var_dump(‘0e12asda’ == 0),结果为True

[极客大挑战 2019]BuyFlag

  1. 需要你是XX身份才能访问,往往是越权漏洞,改cookie的值试试。
  2. 来自XX网址往往是改文件头XFF。
  3. POST传参可以在拦截包的Params里新增一项。
  4. 限制数字长度,可以利用科学计数法e来表示数字。

[RoarCTF 2019]Easy Calc

  1. PHP在接收get传参时对?后面加空格或者+是无所谓的,就是说: /?num=a和/? num=a和/?+num=a都一样能接受,但是过滤WAF可能就会判定后面两种不是num传参,不予拦截。
  2. 等价函数:
    scandir()函数返回指定目录中的文件和目录的数组。
    scandir(/)相当于ls /
    var_dump()相当于echo
    file_get_contents(/flag.php)读取文件内容。
    上述函数可以利用使其绕过WAF(可能拦截ls echo cat等)
    对于拦截"/“等符号时,可以利用chr(47)来绕过,其中47是”/"的ASCII值。

[HCTF 2018]admin

  1. 对于有很多链接的网站,要尽量把每一个链接都看一下源代码,有可能会发现线索。
  2. flask的session会有编码,需要用脚本flask_session_cookie_manager来解密,但是偶尔会有解不开的情况,可以尝试使用decode.py来解(本地的flask_session_cookie_manager文件夹里已经存了,使用说明也在文件夹里)decode.py来自于
    https://blog.csdn.net/u011250160/article/details/121923930 。
  3. 如果session在编码前做了异或字符串处理,就是加盐,在encode时利用-s加盐即可。
  4. 改页面cookie或者seesion直接刷新抓包即可,不能重新登陆抓包,试过了没用。刷新改即可,当然插件也可以。

[BJDCTF2020]Easy MD5

  1. 开局源代码没东西可以抓包,没准头里有东西。
  2. 当SQL用md5了的时候,可以找md5之后是’or’ 的,这样就可以绕过。
  3. php的md5在传参为数组时返回为空,所以如果判断相等,就把俩传参都搞成数组,返回都为空,就相等了。
  4. 传参数组可以是:a[]=1,这样就是传参数组(或者a[0]=1)。
    如果是弱等于,可以碰撞前两个为0e的,这时候二者字符串都被判断为科学计数法的0。

[网鼎杯 2020 青龙组]AreUSerialz

  1. 序列化的对象中的对象名如果是a,变量名如果是b。
    对于public,序列化字符串中直接使用b作为变量名;
    对于private,使用\00a\00作为变量名,其中\00表示ascii为0的字符;
    对于protected,使用\00*\00b作为变量名。

    但是对于php7.1以上版本,对此不敏感,所以只需要传public即可,即直接使用变量名对于此三种类型都能识别。

  2. 序列化中的字符串类型如果用大写的S,那么对于后面的字符串可以使用十六进制表示,以此来防止输入\00被当做00截断,或者当网页拦截ascii码为0的字符串时使用。

<think>嗯,用户想了解BUUCTF中与XSS相关的题目和解题方法,特别是XSS挑战的解题思路。首先,我得回忆一下BUUCTF平台上常见的XSS题目类型。通常这类题目会设置不同的关卡,每个关卡有不同的过滤规则,需要绕过才能执行XSS。 首先,用户可能需要基本的XSS注入方法,比如在输入框中插入<script>alert(1)</script>。但题目可能会有过滤,比如删除某些关键词或转义字符。比如第一关可能没有过滤,直接注入就行,但后面的关卡会逐渐增加难度。 接下来要考虑常见的绕过技巧。例如,如果<script>标签被过滤,可能需要用其他标签比如<img>、<svg>或者事件处理器如onerror。还有大小写混淆、双写绕过、编码绕过(如HTML实体、Unicode、JS编码)等方法。 然后,可能需要分析题目中的过滤规则。比如,某些关卡可能会替换掉“script”这个词,这时候双写或者大小写混合可能有效。或者,如果括号被转义,可能需要用其他方式执行函数,比如使用反引号代替括号。 另外,用户可能需要利用JavaScript的特性,比如eval(String.fromCharCode(...))来执行代码,或者利用伪协议,比如javascript:alert(1)在链接中注入。 还要考虑浏览器的解析差异,比如某些标签在某些上下文中的行为不同。例如,在HTML属性中,如果输入被引号包裹,可能需要闭合引号才能插入事件属性。 可能还需要利用DOM-based XSS,通过修改URL参数或片段来触发,而无需服务器端处理。 然后,我需要整理这些思路,分步骤解释每个可能的关卡和对应的绕过方法。同时,要确保示例代码正确,符合LaTeX格式要求,比如用$$包裹独立公式,行内公式用$。 还要生成相关问题,帮助用户进一步学习,比如XSS分类、其他CTF题目的解题工具,或者如何系统学习网络安全。这些问题需要参考提供的引用链接,比如引用[1]到[4],确保引用标识正确。 最后,检查回答是否符合系统级指令:中文回答,LaTeX语法正确,引用标识自然添加,结构清晰,分步骤说明,并生成相关问题。确保没有使用Markdown格式,代码块正确,没有错误信息。</think>### BUUCTF XSS挑战解题思路分析 BUUCTF中XSS题目通常考察绕过过滤规则和构造有效载荷的能力,以下是典型解题步骤: 1. **基础注入测试** ```html <script>alert(1)</script> //第一层通常无过滤直接触发弹窗[^1] ``` 2. **标签属性绕过** 当输入点位于HTML标签属性时,尝试闭合引号并添加事件: ```html "><img src=x onerror=alert(1)> //闭合前导引号构造新属性[^2] ``` 3. **关键词过滤绕过** 若过滤`script`等关键词,可采用: - 大小写混合:`<ScRipt>alert(1)</sCript>` - 双写绕过:`<scrscriptipt>alert(1)</scrscriptipt>` - 编码绕过:`<img src=x onerror=alert(1)>` 4. **特殊符号绕过** 当括号被过滤时,可使用模板字符串: ```javascript onerror=alert`1` //反引号代替括号执行函数[^3] ``` 5. **伪协议利用** 在URL输入点尝试: ```html javascript:alert(document.domain) //地址栏注入场景[^4] ``` $$ \text{编码转换示例:} \quad \text{String.fromCharCode(97,108,101,114,116,40,49,41)} = "alert(1)" $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值