第二节学习

SQL注入
SQL数据库简介
SQL漏洞主要指SQL Inject漏洞

SQL Inject漏洞概述:
数据库注入漏洞,主要是开发人员在构建代码时没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
方式:
在网址执行正常输入输入一个数据时,该数据会被提交到该应用程序上,通过对应参数获取到该输入时,后台会去连接数据库,将该输入放到对应的操作里,去获取数据库的信息。
在网址上执行非正常输入输入一个数据,该数据会直接拼接在SQL数据库里,改变整个SQL逻辑,改变其执行效果

SQL注入漏洞主要形成的原因:
在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

SQL Inject漏洞攻击流程:
第一步:注入点探测
自动方式:使用web漏洞扫描工具,自动进行注入点发现
手动方式:手工构造SQL Inject测试语句进行注入点发现
第二步:信息获取
通过注入点取期望得到的数据。
1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。
2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容**)
第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
数字型 user_id=id;userid=id; 字符型 user_id='id’;
搜索型 text LIKE"%{$_GET[‘search’]}’"

在SQL Inject项目中选择数字型注入——选择1查询——用burp suite进行抓包——在Proxy项目中选择HTTP history找到该网址选择——右键单击将该网址Send to Repeater——在Repeater项目中找到Raw将该文本末尾id改为1 or 1=1——点击go——在Response项目的Render文本底部就会显示其它选项的id——执行SQL注入——将语句拼接在数据库上
第二节学习第二节学习
第二节学习
字符型注入漏洞:
在SQL Inject项目里输入一个字符串查询(该字符串需要用单引号或双引号做处理)——构建测试字符串 or 1=1时该字符串替换到数据库时会被单引号注解掉——故而需要在该字符串后加上一个单引号使之与前面的单引号匹配再在 or 1=1后面加上#或者//或者空格使其注释掉(其与数字型输入区别在于是字符型注入漏洞所输入的为字符串。
第二节学习
第二节学习
SQL Inject搜索型注入——构造合法闭合语句’%字符%‘进行模糊搜索,使该注入能够满足一个正常的逻辑去进行执行——like ‘%字符%’ or 1=1#(将’%字符%’ or 1=1 #%’ )输入到该搜索栏中)将表里的内容变例出来——成功构造一个page group让后台参数传进去时构成一个合法的SQL语句闭合,使语句变例出来。第二节学习
SQL Inject xx型注入——构造合法闭合语句= (‘xx’) or 1=1#’)——将xx’) or 1=1#加进搜索栏进行查询——将表里对应的数据内容变例出来。
第二节学习
如何构造闭合以及如何查询存在SQL漏洞:
尝试性做出page group测试,根据返回结果查看是非存在SQL漏洞。
判断机制:
1.例子:输入双引号字符串型的输入,返回不成功执行单引号字符串型输入。
2.执行一些命令判断机制真假:根据返回查看所输入数据是否存在SQL注入。
3.查看报错:查看符合拼接进去返回是否造成语法错误,查看报错机制。
总结:构造闭合语句,对SQL中各种类型输入进行闭合测试,构造合法SQL语句,确定存在SQL漏洞,根据所构造的合法的语句欺骗后台数据库执行操作。
注释:
从 ‘#’ 字符从行尾。
从 ‘–’ 序列到行尾。注意 ‘–’(双破折号)注释风格要求第二个破折号后面至少跟一个空格符(例如空格,tab,换行符等等)。改语法与标准SQL注释语法稍有不同。
从/*序列到后面的 */序列,结束序列不一定在同一行中,因此该语法允许注释跨越多行。
mysqlc>SELECT 1+1; #This comment counting to the end of line
mysql>SELECT 1+1; --This comment countinues to the end of line
mysql>SELECT1 /*this is an in-line comment */+ 1;
mysql>SELECT 1+/*this is amultiple-line comment */1;
注入方式get&post区别
Get方式中使用URL提交注入数据;
Post方式中使用抓包工具修改post数据部分提交被注入;
不管是get方式还是post方式,都可能会出现SQL注入漏洞,本质其实是一样的。
SQL Inject手动测试-基于union的信息获取:
Union联合查询:
可以通过联合查询来查询指定的数据
用法举例:
select username,password from user number where id=1 union select 字段1,字段2from表名(联合查询的字数段需要和主查询一致!)如果所查询字数和主查询不一致则会报错。
mysql> select +函数名可执行对该数据库各类函数的查询。
例:在SQL Inject项目的字符型注入中输入:字符’ order by 数字# (猜测主查询有多少字段)(构造一个闭合使用order by 数字;,从1开始一个个数字进行排序进行字段查询。)确认主查询字段——构造union在搜索栏进行查询(a’ union select database(),user()#输入该例样构造语句)——得出查询结果得出数据库名称当前用户权限——输入(输入该例样构造语句a’ union select version(),4#得到version所对应的版本信息已经无意义拼接字段4的无意义输出)通过order by 知道主查询有多少列再通过union构造合法列字段查询,通过数据库提供的方法去获得数据库的一些基础信息其版本或者用户或者名称等等

第二节学习
第二节学习
MYSQL小知识补充: information_ schema
在mysq|中,自带的information schema这个表里面存放了大量的重要信息。具体如下:
如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。
比如:
SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columnsfrom schemaname.tablename的结果取之此表。