DVWA通關之命令注入(command injection)
難度等級:low
過關思路
- 我們先將其難度設定為
low,看到其界面如下:

- 通過分析得知,該功能是輸入一個
IP地址,然后通過ping進行測驗,先輸入127.0.0.1和www.baidu.com測驗如下:
127.0.0.1

www.baidu.com

- 可以看到,IP地址和域名都是能夠ping通的,接下來就是使用
命令拼接測驗了,
輸入127.0.0.1 | whoami

命令注入成功,
- 命令匯總,經過測驗,以下命令均可注入成功,
127.0.0.1|whoami
127.0.0.1&whoami
127.0.0.1000 || whoami
127.0.0.1 && whoami
-
注意:有空格和無空格有時會有意想不到的效果 -
做完了當然得看一下原始碼:

??可以看到,該代碼沒有對用戶的輸入做任何的過濾,直接使用shell_exec函式執行用戶輸入,這是非常危險的,
難度等級:medium
過關思路
- 這里過關思路和low一致,也沒啥可說的,我們主要看一下原始碼就行,
- 源代碼如下:

??通過分析,可以看出,medium關卡比low關卡多了一個黑名單,其通過陣列的方式將&&和;進行了過濾,即將其替換為空,但是,這種過濾基本上還是跟沒有過濾差不多,因為黑名單里的過濾太少了,黑名單也不安全,
難度等級:high
過關思路
- 上手先測驗幾個前面的payload,發下好多都被過濾了,但是還有幾個可以用:
127.0.0.1 || whoami
127.0.0.1|whoami
127.0.0.1000||whoami

- 我們直接看源代碼:

??可以看到,這次的黑名單過濾明顯的多了起來,但是也發現(可能是故意給我們漏出來的??),其在過濾的時候,沒有過濾|而是過濾了|+空格,所以,該代碼只是遇到單單一個|,不會進行過濾,
難度等級:impossible
過關思路
- 這關基本上是不存在安全風險的,之所以放在這里,當作一個關卡,應該也是為了讓我們學習一下怎么進行過濾,我們還是直接看源代碼吧,
- 源代碼如下:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
??一波代碼審計,我們發現,這次的過濾和前面的兩關沒有任何相似之處,而是直接換了一種思路,也就是我們所說的白名單,其控制了用戶的輸入,不在控制用戶的輸入哪些不能用,而是控制用戶的輸入哪些能用,
- 我們還是慢慢從函式入手分析:
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
??這段代碼是控制了用戶身份資訊,在每次和服務器互動之時,服務器會隨機給用戶分配一個ID,用作用戶的身份憑證,這樣也就斷絕了假冒用戶的事件發生,
$target = stripslashes( $target );
??stripslashes函式用于洗掉輸入中的反斜杠,
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ))
??而這段代碼是控制了用戶只能輸入IP地址,無法使用域名,且在用戶輸入IP地址后,使用explode函式以.為分割,將IP地址分割為陣列,最后判斷陣列的個數是否為4,可以說,過濾確實很絕,但是也有一個不好之處就是屏蔽掉了域名,
總結
- 掌握有關命令執行的知識 windows 或 linux 下:
命令執行漏洞(| || & && 稱為管道符)
command1 && command2 先執行 command1,如果為真,再執行 command2
command1 | command2 只執行 command2
command1 & command2 先執行 command2 后執行 command1
command1 || command2 先執行 command1,如果為假,再執行 command2
windows:(1)|(2)||(3)&(4)&&
linux:(1)|(2)||(3);(4)&&
- 命令注入的相關系統函式:
① system()
② exec()
③ shell_exec()
④ passthru()
⑤ popen()
⑥ ``(反引號)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253831.html
標籤:其他
