簡體   English   中英

如何在雙引號內執行Linux shell變量?

[英]How to execute Linux shell variables within double quotes?

如果沒有有效的解決方案,我將面臨以下黑客挑戰,我們不知道。

我們有以下服務器腳本:

read s  # read user input into var s
echo "$s"

# tests if it starts with 'a-f'

echo "$s" > "/home/user/${s}.txt"

我們僅控制輸入“ $ s”。 是否可以發送諸如uname類的OS命令,或者您認為“沒有辦法”?

我看不到執行任意命令的任何途徑。 腳本每次被引用時都引用$s ,以限制您可以執行的操作。

我看到的唯一嚴重的攻擊媒介是echo語句寫入基於$s的文件名。 由於您控制$s ,因此可以使腳本寫入一些意外的位置。

  • $s可以包含類似bob/important.txt的字符串。 如果以足夠的權限執行,此腳本將覆蓋/home/user/bob/important.txt 抱歉,鮑勃!

  • 或者更糟的是, $s可能是bob/../../../etc/passwd 該腳本將嘗試寫入/home/user/bob/../../../etc/passwd 如果腳本以root身份運行...哦!

請務必注意,如果腳本具有正確的權限,則只能將其寫入這些位置。

  • 您可以在$s中嵌入不尋常的字符,這會導致創建不規則的文件名。 粗心的腳本可能會被利用。 例如,如果$sfoo -rf . bar foo -rf . bar ,然后是文件/home/user/foo -rf . bar.txt /home/user/foo -rf . bar.txt將被創建。

    如果有人for file in /home/user; rm $file; done運行for file in /home/user; rm $file; done for file in /home/user; rm $file; done for file in /home/user; rm $file; done他們不得不在他們的手一個驚喜。 他們最終將運行rm /home/user/foo -rf . bar.txt rm /home/user/foo -rf . bar.txt ,這是一場災難。 如果取出/home/user/foobar.txt ,則剩下rm -rf . —當前目錄中的所有內容都將被刪除。 糟糕!

    (他們應該引用"$file" !)

還有另外兩個小問題,盡管我不知道如何惡意利用它們,但確實會導致腳本的行為與預期的有所不同。

  • read允許反斜杠轉義字符,例如空格和換行符。 您可以輸入\\ 空間嵌入空格和\\ 回車read分析輸入的多條線。

  • echo接受幾個標志。 如果$s-n-e那么它實際上不會回顯$s 而是將$s解釋為命令行標志。

使用read -rs或任何\\將丟失/未命中。

read -r s?"Your input: "
if [ -n "${s}" ]
 then
   # "filter" file name from command
   echo "${s##*/}" | sed 's|^ *\([[:alnum:]_]\{1,\}\)[[:blank:]].*|/home/user/\1.txt|' | read Output

   (
    # put any limitation on user here
    ulimit -t 5 1>/dev/null 2>&1

    `${read}`    
   ) > ${OutPut}
 else
   echo "Bad command" > /home/user/Error.txt
 fi

當然:

read s
$s > /home/user/"$s".txt

如果輸入uname ,將顯示Linux 但是請注意:這是一場安全噩夢。 如果有人輸入rm -rf $HOME怎么辦? 您還會對包含斜杠的命令有疑問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM