Jarvis OJ web(一)
前言:總結一下最近做過的jarvisoj的web題,有的很有意思,能學習到很多新知識
LOCALHOST
提示很明顯,偽造IP地址即可
抓包進行偽造,即可得出flag
Login
一個提交頁面,源碼中也沒有發現什么線索,抓包來看一下
有一句提示
這里就涉及到MD5函數的一個知識點了
這到題我們只需讓password后面的語句為真即可,參考了大師傅的博客,提供了這樣一個字符串
輸入ffifdyop,當md5后的hex轉換成字符串后,語句便會成為
select * from admin where password=''or'6<亂碼>' 便可以進行SQL注入除此之外,下面的內容也可以注入
content: 129581926211651571912466741651878684928 hex: 06da5430449f8f6f23dfc1276f722738 raw: \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8 string: T0Do#'or'8
大師傅的博客很詳細的解釋了為什么''or'6<亂碼>'為真,這里就不詳細闡述了,又學到一些新知識
最后輸入內容,即可得出flag
參考博客
md5($password,true)
admin
抓包也沒有任何線索,御劍掃一下
發現admin_s3cr3t.php
抓包,發現admin=0,改成1看看有什么變化
內容發現已經變成admin,一開始還以為得繼續往下找線索,沒想到這就是flag
神盾局的秘密
很酷的圖片,查看源碼是否有線索
圖片后面的編碼是base64,解碼查看一下,結果為shield.jpg,既然是以文件包含的形式傳過來的,那么應該也可以讀取文件,只要也編碼成base64的編碼即可
先讀取showimg.php,base64為c2hvd2ltZy5waHA=,發現源碼
讀取一下index.php,base64為aW5kZXgucGhw,同樣發現源碼
最后再讀取一下shield.php,base64為c2hpZWxkLnBocA==,查看源碼
到這里,基本上源碼都被讀取完了,最后提示說flag is in pctf.php,直接訪問的話是沒有結果的,應該是另一種方法讀取,先審計源碼
//showimg.php文件作用就是讀取文件,我們直接讀取pctf.php,便會顯示File not found!,作用就是這些了。
接下來看//Shield.php
一個魔法函數__construct,這個函數在每次創建新對象時先調用此方法,用this將傳過來的file指向filename(空),下面的代碼則是對傳來的file進行判斷,如果符號則返回@file_get_contents($this->file);
那么我們能進行突破的入口應該就是在//index.php了,代碼很簡單,創建一個新對象,然后將傳過來的參數反序列化賦值給對象,再進行讀取,那思路就很清晰了,魔法函數__construct對下面的賦值是沒有作用的,在之前就已經調用過了。所以不用管,readfile()禁用的都是目錄讀取所需要的一些符號,那我們直接構造pctf.php的序列化,將它傳過去,讀取即可,寫一個簡單的php腳本
<?php//flag is in pctf.phpclass Shield {public $file;function __construct($filename = '') {$this -> file = $filename;}function readfile() {if (!empty($this->file) && stripos($this->file,'..')===FALSE && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {return @file_get_contents($this->file);}}}$x = new Shield('pctf.php');echo serialize($x); ?> O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}在index.php中,傳進去
得出flag,至于真假,都試試即可
IN A Mess
查看源碼,發現線索
發現源碼
下面就來審計源碼
參數a被過濾了.,然后再將參數a傳給data,接下來只需滿足if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4),即可得到flag.txt,首先data必須包含1112 is a nice lab!,這些內容,而且需要以GET方式傳進去,看了大師傅的博客,可以用data:,格式將內容包含進來,具體可以參考data類型的Url格式
參數id是弱類型,直接賦值字母即可繞過
strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)這段代碼一開始不知道怎么繞過,后面發現是基于eregi函數的弱類型,用%00的繞過,當eregi讀到%00的時候,就截止了,具體可以參考ereg漏洞
除此之外,eregi函數之前也是用于正則表達式,所以也可以這樣構造b=.11111或b=*11111或b=?11111都可以
構造payload:
a=data:,1112 is a nice lab!&id=aaa&b=%00111111 a=data:,1112 is a nice lab!&id=aaa&b=.111111 a=data:,1112 is a nice lab!&id=aaa&b=*11111
很顯然,這肯定不是flag,猜想是不是目錄,嘗試一下
果然是,發現可以通過id傳入參數,當id=2時,出現了
這就很明顯了,SQL注入
經過幾次測試,發現將空格給過濾了,不過繞過空格的方法還是有很多的
例如:
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/具體可以參考
繞過空格
這里采用/*1*/的方式進行繞過空格
發現回顯正常,所以沒有閉合符號,而且繞過空格的方法是可行的,發現到第四列會報錯,所以一共有三列
發現報錯
應該是過濾了關鍵字,雙寫繞過
查表
(from也被過濾,同樣采用雙寫繞過)
查字段
爆值
即可得出flag
這次也學到不少知識,就先總結到這里,有時間會繼續總結!
總結
以上是生活随笔為你收集整理的Jarvis OJ web(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I春秋——web Write up(三)
- 下一篇: BUUCTF web(一)