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