声明
本此实验仅限于网络安全教学,严禁用于非法途径。若因此作出任何危害网络安全行为后果自负,与本人无关。
sql注入漏洞
SQL注入漏洞是一种常见的安全漏洞,允许攻击者将恶意的SQL查询插入到应用程序的输入字段中。这可能会导致数据库暴露、数据泄露、数据破坏和应用程序的不安全性。下面是SQL注入漏洞的详细解释:
1、什么是SQL注入漏洞?
SQL注入漏洞是一种攻击,通过该攻击者可以向应用程序提交恶意构造的输入,从而在数据库上执行不受控制的SQL查询。这种漏洞通常出现在应用程序未正确验证和过滤用户输入的情况下。攻击者可以利用这种漏洞来执行未经授权的数据库操作。
2、为什么SQL注入漏洞是危险的?
SQL注入漏洞非常危险,因为攻击者可以执行以下恶意操作:
数据库数据泄露:攻击者可以检索敏感数据,如用户名、密码、信用卡信息等。
数据库数据破坏:攻击者可以修改、删除或损坏数据库中的数据。
恶意代码执行:攻击者可以在数据库上执行恶意代码,可能导致服务器上的安全问题。![image-20230925154338741](C:\Users\dsy\AppData\Roaming\Typora\typora-user-images\image-20230925154338741.png
绕过身份验证:攻击者可以绕过应用程序的身份验证,获得管理员或其他用户的权限。
3、SQL注入漏洞的示例:
假设有一个登录表单,应用程序接受用户名和密码,然后将其用于SQL查询:
sqlCopy code
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
如果应用程序不对输入进行适当的验证和过滤,攻击者可以提交以下内容作为用户名:
bashCopy code
输入的用户名' OR '1'='1
这将更改SQL查询,使其成为以下形式:
sqlCopy code
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '输入的密码';
由于'1'='1'始终为真,攻击者将能够绕过身份验证并获得访问权限。
4、如何防止SQL注入漏洞?
防止SQL注入漏洞需要采取以下措施:
使用参数化查询:使用参数化查询或预处理语句,而不是直接将用户输入插入SQL查询。
输入验证和过滤:对用户输入进行验证和过滤,确保只包含允许的字符和格式。
最小权限原则:数据库用户应该具有最小必要的权限,不要给予数据库用户过多的权限。
错误处理:不要向用户显示详细的错误消息,以防泄露敏感信息。
总之,SQL注入漏洞是一种常见且危险的安全漏洞,应用程序开发人员和管理员需要采取适当的措施来防止它们,以确保应用程序和数据库的安全性。
SQL理论知识
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。
SQL注入原理
SQL注入攻击的本质,服务器没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。
SQL注入的本质
对于输入检查的不充分,导致SQL语句将用户提交的非法数据当做语句的一部分执行。
SQL注入的两个条件
用户能控制输入
原本程序要执行的SQL语句,拼接了用户输入的恶意数据
SQL注入复习实验
联合查询注入
1·字符型
- 寻找注入点和交互点使用 ’ ” /
- 使用order by判断字符
- 使用union select联合查询查看回显
这里显示出2和3是回显位置
- 使用查询语句找到数据库名
用group_concat可以将tables提取出来
information_schema是MySQL特有的库存储着数据库的各种信息
盲注(布尔盲注)
第五关布尔盲注
第一步查看是否有回显
第二步使用order by判断字段
发现没有用
第三步输入length((select database()))判断数据库名字长度后面的数值可以从10依次来试验如果不行就用5,15如若不行就从10依次下减
实验得知7有回显
第四步判断名字的ascii码的对应长度
输入 ascii(substr((select database()),1,1))ascii码长度要比数据库名字长度长很多一般要用100开始若是不行还是依次加5
100不行我们就加
115可以
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符
时间盲注
第九关
发现不管输入什么都不管用了这个时候布尔盲注就不适合我们了,布尔盲注对于页面的正确和错误有不同的回显,如果页面一直没有变化我们就可以用时间盲注其实时间盲注和布尔盲注没有多大的差别,时间盲注多了if和sleep()函数。if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,那么a的结果是假执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串
第一步寻找注入点输入单引号和双引号都可以
第二步判读字段构造输入if(1=1,sleep(5),1)--+
正确的话会延迟五秒如果不正确会直接回显
第三步判断数据库名长度
先试一下大于10发现不对直接回显然后就依次下减
9是正确的
第四步判断数据库字符
输入if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
判断数据库第一个字段为115(ascii码),回显时间为5秒,说明正确
寻找注入点,根据回显时间来判断字符长度,判断长度用ascii码来判断数据库字段
二次注入
第二十四关
第一步创建账号
第二步: 创建一个admin’#的账号让他报错单引号用来闭合前面的单引号,#用来注释后面的内容
第三步进入数据库修改密码
新建一个用户然后在创建一个新的用户后面加上‘#让他闭合
再次修改密码修改成别的用户密码
第一步:插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身就包含恶意内容
第二步:引用恶意数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的,在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,就会造成二次注入
宽字节注入
第三十二关使用prge_replace函数将 / ’ “过滤如果输入id=1"会变成id=1\",使得引号不能用但是可以注意到数据库使用了gbk编码。这里我们可以采用宽字节注入。当某字符的大小为一个字节时,称其字符为窄字节当某字符的大小为两个字节时,称其字符为宽字节。所有英文默认占一个字节,汉字占两个字节
第一步:一个‘判断 union判断有没有回显 宽字节试试
加上?id=-1%df%27%20union%20select%201,database(),3%20--+看看能不能找到回显
然后输入
?id=-1%df%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+
让他爆表
绕过方式
第二十八关大小写绕过
将字符串设置为大小写,例如and1=1转成AND1=1或者AnD 1=1;
mysql默认是不区分大小写的。
第二十五关双写绕过
可以利用某些字符的特性,在输入中使用两个相同的字符来绕过过滤。如果过滤机制将单引号(‘)替换为两个单引号(’'),那么攻可以在输入中使用两个单引号来绕过过滤
总结:
SQL注入是一种常见的安全漏洞,它允许攻击者通过在应用程序的输入字段中插入恶意的SQL代码来执行未经授权的操作或者绕过身份验证。下面是SQL注入绕过的一些原理:
输入验证不充分:当应用程序没有对用户输入进行充分的验证和过滤时,攻击者可以在输入字段中插入恶意的SQL代码。
字符串拼接:当应用程序使用字符串拼接的方式构建SQL查询语句时,攻击者可以通过在输入字段中插入特殊字符来改变原始查询的语义。
不安全的查询参数化:如果应用程序没有使用参数化查询或预编译语句来处理用户输入,而是直接将用户输入拼接到SQL查询语句中,攻击者可以通过在输入字段中插入恶意代码来修改查询的行为。
盲注:攻击者可以通过不断尝试不同的输入来推测数据库中的信息,例如使用布尔盲注或时间盲注等技术