Dream Gallery 是国外一个相册程序,album.php 页面通过传入参数 id 的值来查看不同的专辑,由于没有对传入的 id 的值进行过滤,导致存在 SQL 注入,可获取数据名等。 #### 分析 存在问题的文件位置: ``` <?php $db->query( "select * from albuns order by album_name asc" )->fetchAll(); if ( $db->rows >= 1 ) { $albuns = $db->data; foreach ( $albuns as $album ) { $a = ( object ) $album; $db->query( "select * from fotos where foto_album = $a->album_id order by foto_pos asc" )->fetchAll(); if ( $db->rows >= 1 ) { $f = ( object ) $db->data[0]; ?> <div class="box-detail box-alb" id="<?= $a->album_id ?>"> <div class="box-inner-alb"> <a href="album.php?id=<?= $a->album_id ?>" caption="<?= utf8_decode( $a->album_name ) ?>"> <img src="thumb.php?img=fotos/<?= $f->foto_url ?>" /> <div class="box-inner-fx"> <h2><?= utf8_decode( $a->album_name ) ?></h2> </div> </a> </div> <div class="box-bottom"> <div class="box-bottom-right-photo"><?= $db->rows ?> foto(s)</div> </div> </div> <?php } } } ?> ``` 可以看到 ```$a->album_id``` 直接被构造进 SQL 语句进行查询,由于可以导致 SQL 注入。 #### 测试效果...
Dream Gallery 是国外一个相册程序,album.php 页面通过传入参数 id 的值来查看不同的专辑,由于没有对传入的 id 的值进行过滤,导致存在 SQL 注入,可获取数据名等。 #### 分析 存在问题的文件位置: ``` <?php $db->query( "select * from albuns order by album_name asc" )->fetchAll(); if ( $db->rows >= 1 ) { $albuns = $db->data; foreach ( $albuns as $album ) { $a = ( object ) $album; $db->query( "select * from fotos where foto_album = $a->album_id order by foto_pos asc" )->fetchAll(); if ( $db->rows >= 1 ) { $f = ( object ) $db->data[0]; ?> <div class="box-detail box-alb" id="<?= $a->album_id ?>"> <div class="box-inner-alb"> <a href="album.php?id=<?= $a->album_id ?>" caption="<?= utf8_decode( $a->album_name ) ?>"> <img src="thumb.php?img=fotos/<?= $f->foto_url ?>" /> <div class="box-inner-fx"> <h2><?= utf8_decode( $a->album_name ) ?></h2> </div> </a> </div> <div class="box-bottom"> <div class="box-bottom-right-photo"><?= $db->rows ?> foto(s)</div> </div> </div> <?php } } } ?> ``` 可以看到 ```$a->album_id``` 直接被构造进 SQL 语句进行查询,由于可以导致 SQL 注入。 #### 测试效果 