'黑客比普通程序員高在哪裡?'

程序員 黑客 操作系統 數據庫 叮噹科技資訊 2019-09-06
"

作者:Soptq

來源:知乎

假設今天老闆給我們一個任務,讓我們判斷一下一個 IP 在不在線。我們隨手用 python 寫一個 ping IP 的代碼:

import os
host = input('請輸入要檢測的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')
"

作者:Soptq

來源:知乎

假設今天老闆給我們一個任務,讓我們判斷一下一個 IP 在不在線。我們隨手用 python 寫一個 ping IP 的代碼:

import os
host = input('請輸入要檢測的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')
黑客比普通程序員高在哪裡?

現在,你作為一名審核代碼的人員,不考慮代碼整體結構問題,不考慮為什麼寫這段代碼的程序員用ping,用popen,你能看出什麼問題嗎?

如果看不出的話,想兩個問題:

  1. popen 的本質是什麼?如果你不知道或者沒有用過popen,試著不要去查,猜一下這個函數的作用。
  2. 在這段程序中,popen 要執行的命令是什麼?

既然 popen 後面執行的語句中的 host 變量是由用戶輸入的,那惡意用戶是不是可以輸入一個localhost && whoami 呢?這樣 popen 執行的代碼就變成了 ping -c 1 -t 1 localhost && whoami。注意,就算上述例子中沒有將運行結果直接打印出來,但沒打印出來並不代表代碼沒有運行。例如如果我直接輸入 host 為 localhost && whoami的話,輸出結果還是 IP 存在, 但這並不代表 whoami 命令沒有運行,我們依舊可以建立一個 Reverse Shell。為了驗證結果,我們在代碼裡面讓 result 被打印出來。

"

作者:Soptq

來源:知乎

假設今天老闆給我們一個任務,讓我們判斷一下一個 IP 在不在線。我們隨手用 python 寫一個 ping IP 的代碼:

import os
host = input('請輸入要檢測的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')
黑客比普通程序員高在哪裡?

現在,你作為一名審核代碼的人員,不考慮代碼整體結構問題,不考慮為什麼寫這段代碼的程序員用ping,用popen,你能看出什麼問題嗎?

如果看不出的話,想兩個問題:

  1. popen 的本質是什麼?如果你不知道或者沒有用過popen,試著不要去查,猜一下這個函數的作用。
  2. 在這段程序中,popen 要執行的命令是什麼?

既然 popen 後面執行的語句中的 host 變量是由用戶輸入的,那惡意用戶是不是可以輸入一個localhost && whoami 呢?這樣 popen 執行的代碼就變成了 ping -c 1 -t 1 localhost && whoami。注意,就算上述例子中沒有將運行結果直接打印出來,但沒打印出來並不代表代碼沒有運行。例如如果我直接輸入 host 為 localhost && whoami的話,輸出結果還是 IP 存在, 但這並不代表 whoami 命令沒有運行,我們依舊可以建立一個 Reverse Shell。為了驗證結果,我們在代碼裡面讓 result 被打印出來。

黑客比普通程序員高在哪裡?

這一項技巧叫做 命令注入(Command Injection),普通的程序員如果不是遇到了這類問題,應該是不會接觸到這項技巧的,看見上面的漏洞代碼也會覺得沒什麼問題,最多覺得有點不順眼,但能第一時間反應出有安全漏洞的是佔少數的。

這項技巧聽起來好像很簡單,比逆向,提權那些簡單很多,但這項技巧是富有創造性的,下限很低,上限很高。

比如我們現在知道了存在上面這個問題,那麼在輸入階段把一些關鍵字過濾一下總可以了吧。在這個問題中,我們想讓用戶輸入的是一個 IP ,那就直接過濾掉空格吧,正常 IP 裡面總不可能有空格吧。

再把 &, ;, -,||,| 也過濾掉吧,萬無一失。

import os
host = input('請輸入要檢測的 IP : ')
forbidden = ['&', ';', '-', ' ', '||', '|']
for i in forbidden:
if i in host:
print('Catch you')
exit()
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')

真的萬無一失嗎?

我們在 /tmp 目錄下新建一個 exp.sh, 在裡面輸入我們想執行的命令,在這個例子中我們輸入 whoami。然後 chmod +x exp.sh 賦予執行權限,再通過 $(./exp.sh) 就可以繞過黑名單過濾了。

"

作者:Soptq

來源:知乎

假設今天老闆給我們一個任務,讓我們判斷一下一個 IP 在不在線。我們隨手用 python 寫一個 ping IP 的代碼:

import os
host = input('請輸入要檢測的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')
黑客比普通程序員高在哪裡?

現在,你作為一名審核代碼的人員,不考慮代碼整體結構問題,不考慮為什麼寫這段代碼的程序員用ping,用popen,你能看出什麼問題嗎?

如果看不出的話,想兩個問題:

  1. popen 的本質是什麼?如果你不知道或者沒有用過popen,試著不要去查,猜一下這個函數的作用。
  2. 在這段程序中,popen 要執行的命令是什麼?

既然 popen 後面執行的語句中的 host 變量是由用戶輸入的,那惡意用戶是不是可以輸入一個localhost && whoami 呢?這樣 popen 執行的代碼就變成了 ping -c 1 -t 1 localhost && whoami。注意,就算上述例子中沒有將運行結果直接打印出來,但沒打印出來並不代表代碼沒有運行。例如如果我直接輸入 host 為 localhost && whoami的話,輸出結果還是 IP 存在, 但這並不代表 whoami 命令沒有運行,我們依舊可以建立一個 Reverse Shell。為了驗證結果,我們在代碼裡面讓 result 被打印出來。

黑客比普通程序員高在哪裡?

這一項技巧叫做 命令注入(Command Injection),普通的程序員如果不是遇到了這類問題,應該是不會接觸到這項技巧的,看見上面的漏洞代碼也會覺得沒什麼問題,最多覺得有點不順眼,但能第一時間反應出有安全漏洞的是佔少數的。

這項技巧聽起來好像很簡單,比逆向,提權那些簡單很多,但這項技巧是富有創造性的,下限很低,上限很高。

比如我們現在知道了存在上面這個問題,那麼在輸入階段把一些關鍵字過濾一下總可以了吧。在這個問題中,我們想讓用戶輸入的是一個 IP ,那就直接過濾掉空格吧,正常 IP 裡面總不可能有空格吧。

再把 &, ;, -,||,| 也過濾掉吧,萬無一失。

import os
host = input('請輸入要檢測的 IP : ')
forbidden = ['&', ';', '-', ' ', '||', '|']
for i in forbidden:
if i in host:
print('Catch you')
exit()
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')

真的萬無一失嗎?

我們在 /tmp 目錄下新建一個 exp.sh, 在裡面輸入我們想執行的命令,在這個例子中我們輸入 whoami。然後 chmod +x exp.sh 賦予執行權限,再通過 $(./exp.sh) 就可以繞過黑名單過濾了。

黑客比普通程序員高在哪裡?

這是一個非常簡單的例子,但卻可以說明黑客比程序員高在什麼地方。我認為高在對漏洞的敏感程度和創造力上。提高漏洞的敏感程度需要花大量的時間在 CVE ,黑客論壇等地方,而提高創造力則完全只能靠天賦和運氣了。

也許你會覺得對於上面這個例子,你有很多種辦法可以避免。首先我承認這個例子是我臨時想的,很不好,但也請注意我的這個例子非常簡單且不成熟。在現實的紅藍戰場上,以 SQL 注入為例,都那麼多年了,能完全避免的了嗎?記得今年年初暗網暴露的 Collection 數據庫集合,1000g 的各種被注入的數據庫,涉及全球各種論壇,甚至包括某些銀行,某些人口統計局,某些政府機構。代碼思路是有限的,創造力是無限的。

"

作者:Soptq

來源:知乎

假設今天老闆給我們一個任務,讓我們判斷一下一個 IP 在不在線。我們隨手用 python 寫一個 ping IP 的代碼:

import os
host = input('請輸入要檢測的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')
黑客比普通程序員高在哪裡?

現在,你作為一名審核代碼的人員,不考慮代碼整體結構問題,不考慮為什麼寫這段代碼的程序員用ping,用popen,你能看出什麼問題嗎?

如果看不出的話,想兩個問題:

  1. popen 的本質是什麼?如果你不知道或者沒有用過popen,試著不要去查,猜一下這個函數的作用。
  2. 在這段程序中,popen 要執行的命令是什麼?

既然 popen 後面執行的語句中的 host 變量是由用戶輸入的,那惡意用戶是不是可以輸入一個localhost && whoami 呢?這樣 popen 執行的代碼就變成了 ping -c 1 -t 1 localhost && whoami。注意,就算上述例子中沒有將運行結果直接打印出來,但沒打印出來並不代表代碼沒有運行。例如如果我直接輸入 host 為 localhost && whoami的話,輸出結果還是 IP 存在, 但這並不代表 whoami 命令沒有運行,我們依舊可以建立一個 Reverse Shell。為了驗證結果,我們在代碼裡面讓 result 被打印出來。

黑客比普通程序員高在哪裡?

這一項技巧叫做 命令注入(Command Injection),普通的程序員如果不是遇到了這類問題,應該是不會接觸到這項技巧的,看見上面的漏洞代碼也會覺得沒什麼問題,最多覺得有點不順眼,但能第一時間反應出有安全漏洞的是佔少數的。

這項技巧聽起來好像很簡單,比逆向,提權那些簡單很多,但這項技巧是富有創造性的,下限很低,上限很高。

比如我們現在知道了存在上面這個問題,那麼在輸入階段把一些關鍵字過濾一下總可以了吧。在這個問題中,我們想讓用戶輸入的是一個 IP ,那就直接過濾掉空格吧,正常 IP 裡面總不可能有空格吧。

再把 &, ;, -,||,| 也過濾掉吧,萬無一失。

import os
host = input('請輸入要檢測的 IP : ')
forbidden = ['&', ';', '-', ' ', '||', '|']
for i in forbidden:
if i in host:
print('Catch you')
exit()
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在線')
else:
print('IP 不在線')

真的萬無一失嗎?

我們在 /tmp 目錄下新建一個 exp.sh, 在裡面輸入我們想執行的命令,在這個例子中我們輸入 whoami。然後 chmod +x exp.sh 賦予執行權限,再通過 $(./exp.sh) 就可以繞過黑名單過濾了。

黑客比普通程序員高在哪裡?

這是一個非常簡單的例子,但卻可以說明黑客比程序員高在什麼地方。我認為高在對漏洞的敏感程度和創造力上。提高漏洞的敏感程度需要花大量的時間在 CVE ,黑客論壇等地方,而提高創造力則完全只能靠天賦和運氣了。

也許你會覺得對於上面這個例子,你有很多種辦法可以避免。首先我承認這個例子是我臨時想的,很不好,但也請注意我的這個例子非常簡單且不成熟。在現實的紅藍戰場上,以 SQL 注入為例,都那麼多年了,能完全避免的了嗎?記得今年年初暗網暴露的 Collection 數據庫集合,1000g 的各種被注入的數據庫,涉及全球各種論壇,甚至包括某些銀行,某些人口統計局,某些政府機構。代碼思路是有限的,創造力是無限的。

黑客比普通程序員高在哪裡?

某論壇的可供免費下載的數據庫。Collection 集需要付費下載

"

相關推薦

推薦中...