当前位置:   article > 正文

web实操(buuctf)和部分知识点学习

web实操(buuctf)和部分知识点学习

1.[HCTF 2018]WarmUp1

(1)打开环境后是这样的

(2)查看源码,发现它有点像白名单绕过

题解:  这里它首先设置了一个白名单,只包含source.php和hint.php,第一个if检查是否存在$page并且是否为字符串。
       检查$page是否在白名单中,是的话返回true。接下来,两个函数一个mb_substr和mb_strpos,总的意思就是截取变量page中?前面的字符串,然后再进行白名单校验。
       考虑了URL编码的缘故,再一次解码之后,进行校验。

(3)接着发现有hint.php文件,然后直接访问

(4)再接着访问ffffllllaaaagggg这个文件,发现报错,说明它不是一个网页文件

(5)这里尝试用传参方式打开?file=hint.php?../../../../../ffffllllaaaagggg就可以找到flag 

2.[ACTF2020 新生赛]Include

(1)进入题目环境后中只有一个链接(2)点进去之后是一句问句,没啥用,根据url头可以发现他是一个「文件包含」漏洞,这里使用「PHP伪协议」读取文件源码。(3)查看源码,发现啥也没有,可见它的重要信息不在前端源码,说明是在后端源码中(4)这里就需要引入一个新知识点   

文件包含功能有个「特性」,对于被包含的文件,「代码」部分会直接执行,不会在页面中显示;「非代码」部分(即不能执行的内容)则会在页面中显示。针对这一特性,我们可以将被包含文件的内容「编码」为不可执行的内容,让其在页面中显示,再将页面中的内容在本地「解码」,就可以拿到文件的后端源码了。这里可以使用PHP伪协议对文件内容进行base64编码,

所以这里file参数可以改为  ?file=php://filter/read=convert.base64-encode/resource=flag.php

(5)再次解出这个base64编码就可以看到后端源码了,发现flag也在其中

3.[ACTF2020 新生赛]Exec

(1)打开环境后是一个ping页面,这里直接输入一个ip地址127.0.0.1是什么?
你直接度娘下第一个搜索结果一般是 ip 地址,127.0.0.1 为保留地址。直白地说 127.0.0.1 就是一个 ip 地址,不同于其它 ip 地址的是它是一个指向本机的 ip 地址,也称为环回地址,该 ip 地址不能使用在公网 ip 上,对任何一台电脑来说,不管是否连接到INTERNET上,127.0.0.1 都是指向自己。 事实上整个 127.* 网段都是环回地址,127.* ip 段都为保留地址,只是规则制定者将其中的 127.0.0.1 规定为指向本机自己。

(2)ping出来发现是 一个网页目录(3)直接输入127.0.0.1|ls查看下一级目录(4)发现果然有一个flag文件(5)直接cat /flag查看即可找到flag4.4.[GXYCTF2019]Ping Ping Ping

(1)打开页面后发现是一个提示传参的页面,

(2)那我就直接给它传个参然后抓包(3)发现它会去ping我们传入的ip,也就是去执行了ping命令。(4)那么我直接尝试执行多条命令试试:可以看到在当前目录下,有index.php和flag.php两个文件。(5)但是当我尝试去读flag.php的时候,出现了过滤信息:​​​​​​​(6)很显然这里是过滤了空格。
经过查阅我发现$IFS$数字,这种方式可以成功绕过空格。这里应该是过滤了{}和<>,但是紧接着又来了一个过滤:flag(7)这里既然它过滤了flag这个字符,那就需要想一种办法饶过它,这里我 用的是变量拼接的方法:

(8)弄了之后发现还是不对,那就使用单个变量再试试,发现果然能行:

5.[SUCTF 2019]EasySQL

(1)打开后是这样一个页面,是sql注入,也没太多可用信息

(2)首先判断注入类型,分别输入1   1’    0    1‘  # 等 尝试发现只有1有回显,其他没啥反应,说明这应该不是数字或字符型注入,类似堆叠注入

(3)这里先爆个表  1; show databases;

(4)然后爆列  1;show tables;

(5)再爆个字段名,但是发现输入  1;show columns from 1; 和1;show * from 1 回显都是错误 

(6)查看一下源码,看到传参类型为post,方式为query。根据前面的回显:输入1到9返回Array ( [0] => 1(此处的1可能代表Ture) ),输入0或字符没有回显,仅有的两种回显,可以判断出,后端应该使用的是逻辑或,即条件为真进行回显或条件不满足返回空白

逻辑或:|| 两边,一侧为1则取1,否则取0。

注:

 ps:补充

1、post请求的Parameter Type是可以是query,而一般情况下post请求方式的Parameter Type是 body,在一些极少情况下,post请求的参数体可能会存在body及query共存的情况。

2、所以这其实涉及到post请求的三大部分:header、body、query(简单来说:header:请求头、body:多参数请求体、query:单参数请求体)。

3、后端的接口在不注解的情况下默认是query,所以get请求用query,一般传递单个参数。而post请求多用body,一般传递多个参数。

4、params就是query参数,params的值只能是一个字符串,不能传递对象类型的参数,如果参数中涉及到了传递对象,就要选择body传参。

5、对象类型参数:顾名思义,参数类型是我们定义的类。我们知道int型参数,char型参数等,对象类型原理相同,即传入某个函数的参数是对象类型的

总的来说就是post['query']用来获取用户输入的字符串
 

(7)所以这里需要将逻辑或改为逻辑与  1;set sql_mode=PIPES_AS_CONCAT;select 1

注:sql-mode参数

ONLY_FULL_GROUP_BY:

    对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

    NO_AUTO_VALUE_ON_ZERO:

    该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

    STRICT_TRANS_TABLES:

    在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

    NO_ZERO_IN_DATE:

    在严格模式下,不允许日期和月份为零

    NO_ZERO_DATE:

    设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

    ERROR_FOR_DIVISION_BY_ZERO:

    在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

    NO_AUTO_CREATE_USER:

    禁止GRANT创建密码为空的用户

    NO_ENGINE_SUBSTITUTION:

    如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

    PIPES_AS_CONCAT:

    将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

    ANSI_QUOTES:

    启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

    ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/501763
推荐阅读
  

闽ICP备14008679号