我有一个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
如何在预期的输出中将变量值扩展到双引号内?
答案 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 []引用,因此他们不必这样做。