CTF挑战:能否绕过指定正则表达式实现JS注入?
首先拆解给定的正则规则:/^[".=acdeimnotu]*$/,仅允许以下字符:双引号"、点.、等号=,以及小写字母a,c,d,e,i,m,n,o,t,u。所有注入的Payload经decodeURIComponent解码后,必须完全由这些字符组成才能通过校验并被eval执行。
可操作的范围限制
基于允许的字符,我们能构造的代码仅能完成以下操作:
- 访问全局对象
document(其所有字母均在允许列表内) - 访问
document.domain(属性名的每个字母也符合要求) - 赋值变量,例如
d=document.domain - 调用字符串的
concat方法(方法名concat的所有字母均允许),用于拼接字符串
直接代码注入的瓶颈
所有能触发代码执行的核心函数(如alert、eval、Function等)的名称均包含正则不允许的字符(比如alert中的l、r;eval中的v、l),因此无法直接在Payload中写出这些函数名。同时,由于缺少运算符(如+、^),无法通过位运算或字符串拼接生成这些字符;也无法通过字符串方法(如charAt的h、r不允许)提取其他字符。
可行的攻击路径
利用可控域名场景
如果目标域名本身包含可执行的代码片段(且仅由允许字符组成),可以将Payload设为document.domain,此时eval(document.domain)会直接执行域名对应的代码。例如若域名为1+1,会执行计算并返回结果;若域名为符合规则的可执行片段,就能完成注入。跨域攻击利用
可以通过Payloaddocument.domain="父域名"修改当前页面的document.domain值,实现子域名向父域名的跨域访问,进而利用父域名的资源漏洞。但这不属于直接的JavaScript代码注入。
结论
在通用环境下,无法仅用允许的字符构造出如alert(1)这类典型的代码注入Payload。但结合特定场景(如可控域名、跨域环境),仍能实现对应的攻击效果。
内容的提问来源于stack exchange,提问作者Kubbi

