web5
1.i春秋 文件包含
REQUEST 接受数据,先传个?path=flag.php 看看能不能有什么结果,没得
查了以下发现 allow_url_include打开,即可以使用php://input用包含post中的代码。
上传<?php echo 'ls' ;?>
打开第一个文件即得flag。
2.文件上传
打开发现直接可以上传文件,写个一句话往上传试试,类型不允许。
上传图片试试,
成功,
抓包试试
改下类型,1.php上传成功。
菜刀连接发现没有什么可用的,看了眼wp发现有一个ctf.sql,但我那个没有...
这个大概要连接数据库就能看到flag了。
3.sql注入。
打开题告诉说flag在数据库里,测试存在注入点。
判断字段,报错了,猜测过滤了关键字,
尝试发现只有<>回显正确,order by判断字段为3
?id=1%20union%20sele<>ct%201,2,3,发现显示位
查看数据库,
接下来就常规操作,查表
列
查flag字段即可。
4.i春秋登陆题。
打开网页,查看源码,最先发现test1 test1
试试可以登进去。但没有结果,抓包看看。
发现有个show 值为0,这里在左边改为1试试,
返回了源码
发现需要让 $login['user'] === 'ichunqiu',输出flag,
这里用php解密一下,将结果添加到cookie中的token中然后发过去即可得到flag。
5.ichun qiu test
打开题目发现为cms,百度了一下有现有的漏洞可直接利用
/search.php?searchtype=5&tid=&area=eval($_POST[1])
上传后用菜刀连接,
发现数据库的名称以及账号密码,
连接数据库,
即得fiag。
6.shiyanba sql2
题目提示过滤,
试试几个基本字符。
发现空格和select被过滤了,尝试sel<>ect,不行,而且发现(也没得了。
这里查了下用/**/select/**/可以绕过,但是不能用(就没办法查数据库这些
查一下全部表名了,
'union/*!select*/table_name%0afrom%0ainformation_schema.tables%23
查看字段,
但其实这个最开始就可以猜一猜flag这个表了,直接碰运气也是可以的...
7.shiyianba md5守株待兔
一道脑洞题,
给了一个系统的密钥和自己的密钥,而且每刷新一次系统的密钥就会变,
用MD5解密发现是越来越大的,推测是根据时间改的,
网上安利了师傅的脚本,
大概理解着敲了下,
跑出flag,
8.shiyanba web200
打开题目,观察应该是代码审计了。
看一下函数意义,
strrev是一个将字符串进行翻转的函数。
substr是一个取字符串子串的函数,其用法为strsub(str, start, length),第一个参数为字符串,第二个参数为起始位置,第三个参数为子串长度,返回的结果就是str字符串从start这个位置开始的长度为length的子串。
ord函数的参数为字符串,此函数将返回字符串第一个字符的Acsii码。
str_rot13:如名,对字符串参数进行ROT13编码,ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得。
按顺序读一下代码,首先反转字符串,再把反转后的每个字符加1,再base64编码,反转,root13编码,
这里返回去就对了,
得到flag
9.shiyanba 程序逻辑
进入发现是一个登陆框,看源代码发现
打开发现源码。(截取)
if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("********, "*****", "********"); mysql_select_db("phpformysql") or die("Could not select database"); if ($conn->connect_error) { die("Connection failed: " . mysql_error($conn)); } $user = $_POST[user]; $pass = md5($_POST[pass]); $sql = "select pw from php where user='$user'"; $query = mysql_query($sql); if (!$query) { printf("Error: %s\n", mysql_error($conn)); exit(); } $row = mysql_fetch_array($query, MYSQL_ASSOC); //echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { echo "<p>Logged in! Key:************** </p>"; } else { echo("<p>Log in failure!</p>"); }
可以发现user存在单引号注入,但密码稍微复杂,需满足($row[pw]) && (!strcasecmp($pass, $row[pw])),
构造payload, user='union select md5(1)#&pass=1 post提交即可。
10.shiyanba false
打开网页,查看源码先,
<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';}
?>
读一下输出flag的条件,首先要传入name和password,且不能相等。只有当(sha1($_GET['name']) === sha1($_GET['password']),输出flag
sha1()函数默认的传入参数类型是字符串型,可以传入其他类型,使其返回值为false。如数组类型。
用数组传,
?name[]=a&password[]=b 即得到flag。