bash脚本的双引号中的变量未扩展

时间:2020-01-13 17:02:38

标签: bash shell variables

我有一个bash脚本,在这里我试图调用一个curl,该curl将变量值作为输入。尝试执行bash脚本时,变量值未用双引号引起来。

变量扩展后脚本中的预期卷曲应为:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id="fgsd34sff334" '

在调试模式下观察时,执行如下操作:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" '

我的bash脚本如下:

#!/bin/bash

idp_sub=""


for idp_sub in $(cat /opt/SP/jboss/home/mayur/es_idp_sub.txt)

do

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt


done

如何在预期的输出中将变量值扩展到双引号内?

2 个答案:

答案 0 :(得分:1)

您的双引号字符串在单引号内,不会被扩展。

比较:

foo=bar
echo 'foo=\""$foo\"'
echo 'foo="'"$foo"'"'

在第二个示例中,我们将单引号和双引号$foo结束,然后为最后的'开始新的单引号。

如果我们改用printf进行扩展,可能更容易阅读:

printf 'foo=%s\n' "$foo"

您可能希望将其作为流程替代来运行。

但是...

这是构造SQL查询的错误危险方法(如果转发任意查询,Web服务器也很差-我希望它没有写操作数据权限)。阅读有关“ SQL命令注入”的信息,并在理解问题后返回此代码。

答案 1 :(得分:0)

bash不会扩展单引号内的所有内容,包括任何双引号和变量名。好消息是您可以结束单引号部分并立即开始双引号部分以引入变量,并且所有变量都将串联到应用程序的单个参数中(curl)。试试:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\"'"$idp_sub"'\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt

通过拒绝任何包含双引号的字符串,可以使代码具有高度的防注入性,但是您可以拒绝某些已经合法转义的字符串。

如果可以使用q语法引用字符串,则可以使其更加防注入,但是我想攻击者只需注入]"

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=q\"['"$idp_sub"]'\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt

然后,您可以搜索并拒绝模式字符串]"作为您的反注入,这将允许更多种类的合法字符串。您必须告诉用户您已经在他们的输入中应用了q []引用,因此他们不必这样做。