ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XSS跨站脚本攻击

2021-09-14 01:02:54  阅读:229  来源: 互联网

标签:脚本 XSS 跨站 para url params result input payload


0x01 XSS

最简单的一个案例,输入即输出

代码示例:

 

 

 测试语句:?id=<script>alert(1)</script>

0x02编码解码

编码解码输出时,可能导致XSS编码绕过的情况

代码示例:

 

 

 测试语句:id=%25253Cscript%25253Ealert(/xss/)%25253C/script%25253E  (预先将特殊字符编码成URL格式)

结论:根源在url解码输出,导致存在三重url编码绕过

建议:HTMLENCODE处理后直接输出变量,不需要使用urldecode解码处理

0x03 HTML不规范

代码示例:

 

 

 获取参数,在一个input元素的属性里输出这个变量,采用单引号闭合,但函数默认只转换双引号,不对单引号做转义

测试语句:?name=222' onclick='alert(1)

建议:将HTML标签的属性值用双引号引起来

0x04黑名单过滤

通过在全局变量引入过滤函数,提供黑名单过滤

代码示例:

 

 

 虽然过滤了常见的事件,但是还是存在未被过滤的情况,需要建立自己的XSSFUZZ进行触发,找到合适的事件,最终得出payload

测试语句:?name=123' onfocus='alert(1)

0x05漏洞防护

1、PHP提供了两个函数htmlentities()和htmlspecialchars(),吧一些预定义的字符转换为HTML实体

防御代码示例:

 

 

 2、其他的通用的补充性防御手段

A、在输出html时,加上Content  Security  Policy的Http  Header

(作用:可以防止页面被XSS攻击时,嵌入第三方脚本文件)

(缺陷:IE或低版本的浏览器可能不支持)

B、在设置Cookie时,加上HttpOnly参数

(作业:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)

(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)

C、在开发API时,检验请求的Referer参数

(作用:可以在一定程度上防止CSRF攻击)

(缺陷:IE或者低版本的浏览器中,Referer参数可以被伪造)

 

附录:XSS FUZZ脚本(python类型):

#! /usr/bin/env python

#
_ * _ coding: utf - 8 _ * _
import requests
import urlparse
import urllib# 使用说明, 修改第54行处的字典即可使用, 支持GET、 POST等简单XSS验证# url 支持 * 号 如 http: //127.0.0.1/test.php?id=1*3333 payload会替换*号内容
global result_dict
result_dict = {}
def get(url, para, payload):
params = {}
result = urlparse.urlparse(url)
params = urlparse.parse_qs(result.query, True)
if '*' in params[para][0]:
params[para] = str(params[para][0]).replace("*", payload);
else :
params[para] = str(params[para][0]) + payload
m_url = result.scheme + "://" + result.netloc + result.path
data = urllib.urlencode(params)
geturl = m_url + '?' + data
response = requests.get(geturl)
result_dict[payload] = [response.content, len(response.content),
response.status_code
]
return result_dict
def make_get_resule(url, para):
with open('on.txt') as f:
for payload in f.xreadlines():
payload = payload.strip()
if '#' in payload or len(payload) == 0:
pass
else :
get(url, para, payload)
result_analysis(payload)
def post(url, data, para, payload):
params = {}
params = urlparse.parse_qs(data, True)
if '*' in params[para][0]:
params[para] = str(params[para][0]).replace("*", payload);
else :
params[para] = str(params[para][0]) + payload
response = requests.post(url, data = params, timeout = 5)
result_dict[payload] = [response.content, len(response.content),
response.status_code
]
return result_dict
def make_post_resule(url, data, para):
with open('on.txt') as f:
for payload in f.xreadlines():
payload = payload.strip()
if '#' in payload or len(payload) == 0:
pass
else :
post(url, data, para, payload)
result_analysis(payload)
def result_analysis(payload):
新文章将同步更新到我的个人公众号上, 欢迎各位朋友扫描我的公众号二维码关注一下我, 随时获取最新动态。
if payload in result_dict[payload][0]:
print "[+]" + payload + " ok"
if result_dict[payload][0].count(payload) > 1:
print "[+]" + payload + " repeat"
if __name__ == '__main__':
result_dict = {}
methodselect = raw_input("[?] Select method: [G]ET or [P]OST (G/P): ")
.lower()
if methodselect == 'g':
url = raw_input("Please input url:")
para = raw_input("Please input para:")
if 'https://' in url:
pass
elif 'http://' in url:
pass
else :
url = "http://" + url
make_get_resule(url, para)
elif methodselect == 'p':
url = raw_input("Please input url:")
data = raw_input("Please input data:")
para = raw_input("Please input para:")
if 'https://' in url:
pass
elif 'http://' in url:
pass
else :
url = "http://" + url
make_post_resule(url, data, para)

注:需要格式化python脚本

标签:脚本,XSS,跨站,para,url,params,result,input,payload
来源: https://www.cnblogs.com/ayheng/p/15265705.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有