IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【后门】三段代码实现DB工单后门 -> 正文阅读

[大数据]【后门】三段代码实现DB工单后门

查个问题十分钟,走工单一小时。慢!
连线上库一分钟,一小时就超时,累!
自己写吧!

注意:
查询必须带上where/limit(强校验)
增删改提交工单生成工单地址——>拥有签名的员工可签名执行

DbWorkController


@Controller
@RequestMapping("/dbWork")
public class DbWorkController {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    CacheHelper cacheHelper;
    @Autowired
    DbWorkBizMapper dbWorkMapper;


    @RequestMapping
    public String dbWorkIndex() {
        return  "dbWork";
    }

    @RequestMapping("/{uuid}")
    public ModelAndView dbWork(@PathVariable("uuid")String uuid) {
        ModelAndView modelAndView = new ModelAndView("dbWork");
        if(Strings.isBlank(uuid)){
            return modelAndView;
        }
        String sql = cacheHelper.get("WMS_ADMIN_DBWORK_TRANSACTION:" + uuid);
        modelAndView.addObject("uuid",uuid);
        modelAndView.addObject("sql",sql);
        return modelAndView;
    }


    @PostMapping("/select")
    @ResponseBody
    public ResultDTO select(String sql){
        String sql1 = sql.toLowerCase();
        if(!sql1.contains("where") || !sql1.contains("limit")){
            throw new BusinessException(400,"安全起见,请加上where和limit");
        }
        List<LinkedHashMap<String, Object>> list = dbWorkMapper.select(sql);
        list.forEach(item->{
            item.entrySet().forEach(entry->{
                Object value = entry.getValue();
                if(value instanceof Date){
                    entry.setValue(DateUtils.convertTimeToStr((Date) value));
                }
            });
        });
        return ResultDTO.success(list);
    }

    @PostMapping("/submit")
    @ResponseBody
    public ResultDTO submit(String sql){
        String  uuid = UUID.randomUUID().toString();
        cacheHelper.put("WMS_ADMIN_DBWORK_TRANSACTION:"+uuid,3600*24,sql);
        logger.info("工单{}已提交:\n{}",uuid,sql);
        return ResultDTO.success(uuid);
    }

    @PostMapping("/excute/{uuid}")
    @ResponseBody
    public ResultDTO update(@PathVariable("uuid")String uuid, @RequestParam String sign) {
        String sql = cacheHelper.get("WMS_ADMIN_DBWORK_TRANSACTION:" + uuid);
        if(Strings.isBlank(sql)){
            throw new BusinessException(400,"工单不存在或已执行!");
        }
        String operator = decryptSign(sign);

        logger.info("工单{}已由【{}】执行:\n{}",uuid,operator,sql);
        cacheHelper.del("WMS_ADMIN_DBWORK_TRANSACTION:" + uuid);
        if(sql.startsWith("update")){
            return ResultDTO.success(dbWorkMapper.update(sql));
        }
        if(sql.startsWith("insert")){
            return ResultDTO.success(dbWorkMapper.insert(sql));
        }
        if(sql.startsWith("delete")){
            return ResultDTO.success(dbWorkMapper.delete(sql));
        }
        throw new BusinessException(400,"不支持的sql类型");
    }

    private String decryptSign(String sign){
        String keyt = toSHA(sign);
        switch (keyt){
            case "e49564765c06eb8fb0ea4d75d65b45c89b8e2e54a22c21fd966e8f303c512a3a":return "zengdm";

        }
        throw new BusinessException(403,"无效的签名");
    }

    public static String toSHA(String ePass) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(ePass.getBytes(StandardCharsets.UTF_8));
            byte[] byteBuffer = messageDigest.digest();
            StringBuffer strHexString = new StringBuffer();
            for (byte b : byteBuffer) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    strHexString.append('0');
                }
                strHexString.append(hex);
            }
            return strHexString.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

DbWorkBizMapper


@Repository
public interface DbWorkBizMapper {

    @Select("${sql}")
    List<LinkedHashMap<String,Object>> select(@Param("sql") String sql);
    @Update("${sql}")
    int update(@Param("sql") String sql);
    @Insert("${sql}")
    int insert(@Param("sql") String sql);
    @Delete("${sql}")
    int delete(@Param("sql") String sql);
}

dbWork.html

<!DOCTYPE html>
<html lang="en" xmlns:layout="http://www.thymeleaf.org" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>DB工具</title>
    <meta name="viewport" content="width=device-width,initial-scale=1"/>
    <link rel="stylesheet" href="/libs/layui/css/layui.css"/>
    <script src="/libs/layui/layui.js"></script>
    <script src="/javascripts/common.js"></script>
    <script src="/javascripts/utils/ajaxhook.min.js"></script>
    <link rel="stylesheet" href="/stylesheets/layui-theme.css"/>
    <link rel="stylesheet" href="/stylesheets/app.css"/>
</head>
<body class="smallsize" style="padding: 0 5% 0 5%;">
    <input id="sqlSubmit" th:value="${sql}" hidden />
    <input id="uuid" th:value="${uuid}" hidden />

    <textarea id="sql" placeholder="输入sql语句,查询语句需包含where和limit" class="layui-textarea"
        style="width: 1000px;height: 200px;margin-top: 20px;"></textarea>
    <button type="button" class="layui-btn" id="dbSelect"style="margin: 15px;">查询</button>
    <button type="button" class="layui-btn" id="dbSubmit"style="margin: 15px;">提交工单</button>
    <button type="button" class="layui-btn" id="dbExcute"style="margin: 15px;display:none;">执行工单</button>
    <table class="layui-table-radius" id="myTable" lay-filter="myTable"></table>

</body>

<script th:inline="none">

    layui.use(['form', 'laydate', 'laypage', 'layer', 'table', 'carousel', 'element', 'httpclient','upload'], function () {
        var laypage = layui.laypage //分页
            , table = layui.table //表格
            , laydate = layui.laydate //日期
            , httpclient = layui.httpclient
            , upload = layui.upload
            , form = layui.form;
        const {$} = layui;

        // 判断sql是查询还是提交工单
        $("#sql").change(function () {
            if($(this).val().startsWith("select") || $(this).val().startsWith("SELECT")){
                $("#dbSelect").show();
                $("#dbSubmit").hide();
            }else{
                $("#dbSelect").hide();
                $("#dbSubmit").show();
            }
        });

        if($("#sqlSubmit").val()){
            $("#sql").val($("#sqlSubmit").val());
            $("#sql").attr("readonly", true);
            $("#dbSelect").hide();
            $("#dbSubmit").hide();
            $("#dbExcute").show();
        }

        $("#dbSelect").click(function () {
            httpclient.post('/dbWork/select', {
                'sql': $("#sql").val()
            }, function(resp){
                let list = resp.data;
                if (list.length <= 0){
                    layer.msg('未查到数据');
                    return;
                }
                let item1 = list[0];
                let cols = [[]]
                Object.keys(item1).forEach(
                    key=>{
                        let width = key.length*8+32;
                        cols[0].push({field: key, title: key,width: width,align: 'center'})
                    }
                )
                table.render({
                    elem: '#myTable',
                    cols: cols,
                    data: list,
                        page: true,
                        limits: [10, 20, 50, 9999],
                        limit: 20
                });
            });
        });
        $("#dbSubmit").click(function () {
            httpclient.post('/dbWork/submit', {
                'sql': $("#sql").val()
            }, function(resp){
                let uuid = resp.data;
                if (uuid){
                    layer.alert('工单已提交:http://'+window.location.host+'/dbWork/'+uuid);
                }
            });
        });

        $("#dbExcute").click(function () {
            layer.prompt({
                formType: 1,
                    value: '',
                    title: '请输入签名',
                    btn: ['确定','取消'],
                    btnAlign: 'c'
            }, function(value,index){
                httpclient.post('/dbWork/excute/'+$('#uuid').val(), {
                    'sign': value
                }, function(resp){
                    let num = resp.data;
                    layer.alert('工单已执行,成功行数:'+num);
                });
            });
        });
    });

</script>
</html>
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:23:07  更:2022-04-27 11:27:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:04:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码